Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 59 из 87<  1 ... 56  57  58  59  60  61  62 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Код:
#pragma pack(1)
struct sym
{
   char ch;
   float freq;     
   char code[N];
   sym *left;
   sym *right;
   int len1;
};
#pragma pack(pop)
#pragma pack(1)
struct read
{
   char ch;
   char code[N];
   int len1;

}sim[N];
#pragma pack(pop)

и чем больше структур с #pragma pack(pop) #pragma pack(1), тем больше предупреждений о том, что число извлечений из стека превышает число занесений........И больше неменяющихся счетчиков.... :bandhead: :bandhead: :bandhead: :bandhead:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
manya писал(а):
и чем больше структур с #pragma pack(pop) #pragma pack(1), тем больше предупреждений........

Не заморачивайся. Зачем тебе эти pragm`ы ? Хаффману, если я не ошибаюсь, они не нужны.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Точно, спасибо, надо их покоцать :-) Просто уже интересно

Добавлено спустя 7 минут 5 секунд:
да-а-а-а, счетчики-то все равно не меняются :gun:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
а #pragma pack(push) где?

#pragma pack(push)
#pragma pack(1)
struct read
{
char ch;
char code[N];
int len1;
}sim[N];
#pragma pack(pop)

это нужно только для тех структур которые ты будешь записывать в файл в бинарном виде, и не надо перед каждый структурой это делать, достаточно сделать

#pragma pack(push)
#pragma pack(1)

потом определения структур

затем
#pragma pack(pop)


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
спасибо :-)

Добавлено спустя 3 минуты 31 секунду:
и последний вопрос: чисто теоретически, от чего может быть такое:
перед циклом инициализируются\ объявляются счетчики, в цикле они инкрименируются и прочее, но все равно значение = исходному?

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
Obscury писал(а):
Всё зависит от компилятора. Если компилить С-шным компилятором С-шный код (а какой же ещё), то скорее всего поля структуры будут передаваться через стек. Если этот же код компилять С++ компайлером, то будет код, который я приводил выше (копирование по средством копи-конструктора).


если структура или класс без конструктора копирования, то не будет никакого вызова функции, будет просто все скопировано в стек (по элементно или 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++;
}

тут counter == 0 ? не может быть такого....

for (int i=0;i<strlen(mas);)
...


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Но-но! :D Во-первых, попрошу - постила :-) А во-вторых, это уже другой счетчик, не из этого цикла. Это у меня тут очепятка, в проге нормально.

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


Последний раз редактировалось manya 22.11.2009 0:00, всего редактировалось 3 раз(а).

 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya писал(а):
ну во-первых попрошу - постила :-)


ок, на этом форуме указания пола к сожалению нет :) (как-то железками и программированием все больше мужчины занимаются поэтому на автомате предполагаю наиболее распространенный вариант)

manya писал(а):
А во-вторых, это уже другой счетчик, не из этого цикла.


надо смотреть код, где именно этот счетчик и где он проверяется. А так чисто теоритически вариантов не мало.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Кстати, в этом цикле тоже
#77

Добавлено спустя 2 минуты 11 секунд:
если очень внимательно присмотреться( сорри за столь мизерную картинку) :oops: , то сразу же после выхода из цикла counter1=0, а в цикле он не меняется, объявление и инициализация есесно до цикла

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
progn писал(а):
если структура или класс без конструктора копирования, то не будет никакого вызова функции, будет просто все скопировано в стек

Слегка ошибся в фразе "Если этот же код компилять С++", в С копи-конструктор не задашь. А для структуры в C++ запросто, кстати.

manya, очевидно в цикл не входим. Бряку там поставь. Вообще, приучайся проверять успешность проведённых операций. fp2 точно открыт? Код очень плохо читается, получаем указатель на FILE fp4, но работаем с fp2. Зачем его раньше времени открывать? Переменные нужно объявлять как можно ближе к месту их первого использования. И, кстати, лучше выбирай префиксную форму инкремента, если можно использовать любую из двух. В случае простых типов компилятор конечно сам прооптимизирует, но если это перегруженная операция (итератор например), то силёнок у него не хватит.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Спасибо.
Точно открыт, так как если поставить проверку, не напишет, что не открыт......

Добавлено спустя 8 минут 21 секунду:
и в цикл входит тоже, а все равно не меняется

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
manya, значение внутри цикла инкрементируется (куда ему деваться)? Возможно в следующем цикле for есть ещё одна переменная с именем counter1?


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
нет, точно. Как-то у меня такое уже было, все тоже тогда говорили, что такого не бывает, да и мне слабо верилось, что бывает

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

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 глюки, конечно, имеются, но чтоб такие, это фантастика... Можно посмотреть на код в дизасме. Попробовать изменить код с сохранением логики.
Код:
while((chhh=fgetc(fp2))!=EOF)
{
    mas[counter1++]=chhh;
    printf("\n__counter_1__ = %d", counter1);
}


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
да я это и делаю - одно и тоже - 0 :insane:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
manya писал(а):
да я это и делаю - одно и тоже - 0 :insane:
На Си давно не писал, но: либо не входит в цикл, либо N < чем количество прочтенных символов. Во втором случае вы в цикле (while) выходите за пределы массива mas и "затираете" другие переменные. Это довольно распространенная ошибка.


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
все же счетчик должен меняться нормально при чтении первых N байт файла.

а так при #define N 256, память вполне может перезаписываться и будут очень странные глюки. Нужно обязательно проверять чтобы количество итераций не было больше N, или узнавать размер файла и динамически выделять массив нужного размера.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
N у меня всяко больше( это еще в те древние времена оно было 256, сейчас уже не так)

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 59 из 87<  1 ... 56  57  58  59  60  61  62 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan