и чем больше структур с #pragma pack(pop) #pragma pack(1), тем больше предупреждений о том, что число извлечений из стека превышает число занесений........И больше неменяющихся счетчиков....
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
это нужно только для тех структур которые ты будешь записывать в файл в бинарном виде, и не надо перед каждый структурой это делать, достаточно сделать
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
спасибо
Добавлено спустя 3 минуты 31 секунду: и последний вопрос: чисто теоретически, от чего может быть такое: перед циклом инициализируются\ объявляются счетчики, в цикле они инкрименируются и прочее, но все равно значение = исходному?
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Всё зависит от компилятора. Если компилить С-шным компилятором С-шный код (а какой же ещё), то скорее всего поля структуры будут передаваться через стек. Если этот же код компилять С++ компайлером, то будет код, который я приводил выше (копирование по средством копи-конструктора).
если структура или класс без конструктора копирования, то не будет никакого вызова функции, будет просто все скопировано в стек (по элементно или rep movs зависит от размера структуры/класса), C++ от С тут ничем не отличается. Только если будет конструктор копирования тогда будет копирование им. Но в любом случае все будет через стек идти.
Но все это, в самом деле, не кому не нужная фигня... детали реализации компилятора на конкретном железе, которые совсем не обязательно знать программисту.
Добавлено спустя 13 минут 17 секунд: manya смотри в отладчике что происходит...
тот код что ты постил (довольно плохо читаемый кстати):
FILE *fp4=fopen(name_out,"wt"); char mas[N]; int counter=0; chh=0; rewind(fp2); while((chh=fgetc(fp2))!=EOF) { mas[counter]=fgetc(fp2); // тут неправильно, два раза читаешь из файла, один раз в while другой тут, надо: mas[counter]=cch; counter++; }
ок, на этом форуме указания пола к сожалению нет (как-то железками и программированием все больше мужчины занимаются поэтому на автомате предполагаю наиболее распространенный вариант)
manya писал(а):
А во-вторых, это уже другой счетчик, не из этого цикла.
надо смотреть код, где именно этот счетчик и где он проверяется. А так чисто теоритически вариантов не мало.
Добавлено спустя 2 минуты 11 секунд: если очень внимательно присмотреться( сорри за столь мизерную картинку) , то сразу же после выхода из цикла counter1=0, а в цикле он не меняется, объявление и инициализация есесно до цикла
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
progn писал(а):
если структура или класс без конструктора копирования, то не будет никакого вызова функции, будет просто все скопировано в стек
Слегка ошибся в фразе "Если этот же код компилять С++", в С копи-конструктор не задашь. А для структуры в C++ запросто, кстати.
manya, очевидно в цикл не входим. Бряку там поставь. Вообще, приучайся проверять успешность проведённых операций. fp2 точно открыт? Код очень плохо читается, получаем указатель на FILE fp4, но работаем с fp2. Зачем его раньше времени открывать? Переменные нужно объявлять как можно ближе к месту их первого использования. И, кстати, лучше выбирай префиксную форму инкремента, если можно использовать любую из двух. В случае простых типов компилятор конечно сам прооптимизирует, но если это перегруженная операция (итератор например), то силёнок у него не хватит.
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
manya писал(а):
нет, точно.
Что нет? После операции инкремента значение остаётся прежним что ли? Возможно отладчик врёт... В debug конфигурации работаешь? Попробуй вывести на консоль значение сразу после инкремента.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
"нет" в смысле точно нет больше counter1 Те он есть, но он там не меняется. И инкрементироваться по идее должно. И если посмотреть, то сразу после инкремента оно равно 0..........Может у VS глюк?
Добавлено спустя 7 минут 1 секунду:
Код:
char mas[N]; int counter1=0; int chhh=0; fp2=fopen("teemp.txt","rt"); if(fp2==NULL) { puts("FILE NOT OPEN!!!!!!!"); } else { while((chhh=fgetc(fp2))!=EOF) { mas[counter1++]=chhh; } FILE *fp4=fopen(name_out,"wt"); for (int i=0;i<counter1;) { char byte=0; for(int bit = 0;bit<8 && i<counter1;++bit,++i) { byte <<= 1; byte |= mas[i]- '0'; } //fprintf(fp4,"%o",byte); //fwrite(byte,1,1,fp4); fputc(byte,fp4); } ...........
вроде ничего криминального
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
manya писал(а):
И если посмотреть, то сразу после инкремента оно равно 0
Выведи на консоль сразу после инкремента. У VS глюки, конечно, имеются, но чтоб такие, это фантастика... Можно посмотреть на код в дизасме. Попробовать изменить код с сохранением логики.
На Си давно не писал, но: либо не входит в цикл, либо N < чем количество прочтенных символов. Во втором случае вы в цикле (while) выходите за пределы массива mas и "затираете" другие переменные. Это довольно распространенная ошибка.
все же счетчик должен меняться нормально при чтении первых N байт файла.
а так при #define N 256, память вполне может перезаписываться и будут очень странные глюки. Нужно обязательно проверять чтобы количество итераций не было больше N, или узнавать размер файла и динамически выделять массив нужного размера.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения