Andrii
Дык распечатай, что ты передаёшь, открывается, пройди отладчиком, ...
Andrii
Мало ли что может быть, не тот файл указал, где-т натупил, файл только на чтение, прав доступа нету, директория рабочая не та, ...
Jsx707
исполняемй файл и целевой файл в одном каталоге , имя файла передается как аргумент
Jsx707
#include <stdio.h> #include <stdlib.h> #include <string.h> int analys(char filename[270]); int main(int argc, char *argv[]) { if(argc <= 1) { printf("Options : --help or --filename for syntax analys\n"); return 0; } if(!strcmp(argv[1], "--version")) { printf("Cobra Engine by sp1cklerboy!\nCurrent Version: 1.0 Beta\n"); } else if(!strcmp(argv[1], "--source")) { printf("https//github.com//sp1cklerboy/cobra-engine\n"); } else { analys(argv[1]); } return 0; }
Jsx707
int analys(const char filename[270]) { FILE *fp; fp = fopen(filename , "r"); if(fp == NULL) { perror("Critical Error"); exit(1); } printf("Done!\n"); fclose(fp); return 0; }
Jsx707
вот как сейчас это выглядит
Andrii
int analys(const char filename[270]) ну коряво же... Почему не int analys(const char * filename) ?
Jsx707
щас попробуем , * char это вроде как указатель на адрес в памяти , нет?
ᚢᛊᚹᛟᚴᚺ
Алексей
А мне подскажет кто-нибудь?
Борисов
А тебе в личку написали)
Jsx707
Это просто указатель.
ну если я передаю теперь как * argv[1] , то он ругается ну и как просто argv[1] , то тоже предупреждение
Jsx707
Как передать?
Jsx707
АА
Jsx707
я передал как &argv[1]
Jsx707
скомпилировалось
Andrii
Просто argv[1]
Andrii
Ты просто не можешь передать аргумент, в этом проблема
Andrii
А что говорит отладчик?
Andrii
gcc -O0 -g -ggdb source.c -o app
Andrii
И потом gdb ./app и там b main и r myfile.dat
Jsx707
может просто gcc -g lexer.c -o lexer
Jsx707
gcc -O0 -g -ggdb source.c -o app
а то так он говорит , что нет файла 00
Andrii
может просто gcc -g lexer.c -o lexer
-O0 отключить оптимизацию, чтобы с ума не сойти при отладке
Andrii
а то так он говорит , что нет файла 00
Минус пропустил... Первая буква Оу, вторая цифра нуль: -O0
Jsx707
/usr/bin/ld: /tmp/ccg8Tmqc.o: in function `main': /home/ruslan/gl_learning/src/cobra_engine_script/lexer.c:19: undefined reference to `analys' collect2: error: ld returned 1 exit status
Vladislav
-O0 отключить оптимизацию, чтобы с ума не сойти при отладке
А что такого эта оптимизация дает при отладке?
Jsx707
Андрию теперь кошмары сниться будут
Vladislav
https://www.youtube.com/watch?v=Wh22_O8jXVQ как работает память компьютера, кому интересно
Andrii
А что такого эта оптимизация дает при отладке?
Ну... Это отключение оптимизации. Попробуй сам. Если оптимизация отключена, то строки выполняются в оптимальном порядке, что выглядит как хаотические метания.
Jsx707
а почему тогда компилятор не жаловался.... ладно , я проверю
Andrii
АА, как в отладчике у VS ?
Отлоадчик это gdb а что такое VS?
Vladislav
Та я чет не то сказал, только щас прочитал
Andrii
if(!strcmp(argv[1], "--version")) { printf("Cobra Engine by sp1cklerboy!\nCurrent Version: 1.0 Beta\n"); } else if(!strcmp(argv[1], "--source")) { printf("https//github.com//sp1cklerboy/cobra-engine\n"); } с оптимизацией оптимизатор может посчитать например, что выгоднее проверить первым второе условие, а потом первое. И у тебя программа начнёт выполнятся с третьей строки :)
Andrii
И это немного напрягает
Andrii
А если поставить -O0, то операции будут выполнятся строго в том порядке, в котором написаны
Jsx707
ну я поменял названия функции
Andrii
На практиче ещё хуже,. потому что команды перемешаны: немного от первой строки, потом немного от четвёртой, потом от третей, потом опять от первой, и т. д. И ты вместо ожидаемого 1, 2, 3, 4, получаешь 1, 4, 3, 1, 2, 1, 3, 2, 3, 4
Jsx707
warning: passing argument 1 of ‘analys’ makes pointer from integer without a cast [-Wint-conversion] 19 | analys(*argv[1]); | ^~~~~~~~ | | | char lexer.c:5:26: note: expected ‘const char **’ but argument is of type ‘char’ 5 | int analys(const char * filename[270]);
Andrii
ну я поменял названия функции
Только в одном месте, а в другом не поменял
Andrii
ЗАчем звёздочка то?
Jsx707
ЗАчем звёздочка то?
ну и без нее та же ошибка
Andrii
Просто [270]
Jsx707
ты про ту которая в параметрах?
Vlad
Привет, ребята. Подскажите, что я не так сделал?
Vlad
Andrii
Привет, ребята. Подскажите, что я не так сделал?
Вот, в первой же ошибке сказано человеческим английсикм языком
Andrii
ты про ту которая в параметрах?
Да, это несколько глупо
Danya
что такое cats?
giorgio
это переменная, которую он хочет ввести, но зачем-то выводит
Vlad
что такое cats?
Кошки. Там задачка на переменные
Danya
Кошки. Там задачка на переменные
это я тебе ответ компилятора перевожу
Jsx707
#include <stdio.h> #include <stdlib.h> #include <string.h> int analys(const char filename[270]); int main(int argc, char *argv[]) { if(argc <= 1) { printf("Options : --help or --filename for syntax analys\n"); return 0; } if(!strcmp(argv[1], "--version")) { printf("Cobra Engine by sp1cklerboy!\nCurrent Version: 1.0 Beta\n"); } else if(!strcmp(argv[1], "--source")) { printf("https//github.com//sp1cklerboy/cobra-engine\n"); } else { analys(argv[1]); } return 0; }
Vlad
Что мне сделать?
Jsx707
и вот второй файл
Andrii
Убери 270
Andrii
Зачем тебе надо 270?
Jsx707
ааа , окей
Jsx707
я просто так писал однажды , работало , но там было немного по другому
Andrii
Можно так int analys(const char filename[]);
Andrii
Просто если ты хочешь принимать массив из 270 символов, то и описуй его в программе и передавай его
Jsx707
я убрал
Vlad
Кто поможет ребята? Просто толчёк, я только начал изучать программирование в академии. Поэтому хочу толчёк
Jsx707
но он все равно говорит всегда , что файла нету
Andrii
char filename[270]; strncmp(filename, argv[1], sizeof(filename); ananalys(filename)
Jsx707
ага , хорошо
Andrii
ага , хорошо
Это как делать не надо. Лучше просто `int analys(const char filename[]);`
Andrii
Просто какой-то массив символов произвольной длины