Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Неправильный размер массива


Автор: Alexey68 29.10.2013, 06:57
Здравствуйте All
Возник следующий вопрос:
при подключении внешней библиотеки (.h) в которой содержится массив типа:
Код

char mp_array[] = {0x43,0x21,0x30,0x21,0x43,0x80,0x77 .........};

и в дальнейшем записи в файл при размере файла в 200-300 кб, на выходе получаю размер 63,5 кб (65024).
А файлы в 20-40 килобайт обрабатываются и создаются с правильным размером.
записываю обычно в цикле:

Код

for (i = 0; i < sizeof(mp_array); i++)
{
  fprintf(fop, "%c", mp_array[i]);
}


В чём может быть причина?

Автор: Dem_max 29.10.2013, 07:05
попробуй догадайся из пары строчек кода

Автор: Alexey68 29.10.2013, 07:28
Цитата(Dem_max @ 29.10.2013,  07:05)
попробуй догадайся из пары строчек кода

Dem_max, если про цикл то всё как "обычно", даже не знаю...
неправильно определяется размер массива?, тогда почему с меншьшим объёмом нет проблем...

Автор: vinter 29.10.2013, 07:52
Alexey68, смотри, созаём файл(file.txt) и копируем в него содержимое: 
Код

char mp_array[] = {0x43,0x21,0x30,0x21,0x43,0x80,0x77};

Теперь открываем файл в hex редакторе, и копируем содержимое из него:
Код

63 68 61 72 20 6D 70 5F 61 72 72 61 79 5B 5D 20 
3D 20 7B 30 78 34 33 2C 30 78 32 31 2C 30 78 33 
30 2C 30 78 32 31 2C 30 78 34 33 2C 30 78 38 30 
2C 30 78 37 37 7D 3B 

Цитата

и в дальнейшем записи в файл при размере файла в 200-300 кб, на выходе получаю размер 63,5 кб (65024).

Теперь понятно почему?
Цитата

А файлы в 20-40 килобайт обрабатываются и создаются с правильным размером.

У тебя всё с правильным размером, C++ не умеет размер неправильно считать. Смотреть на размер файла последнее дело. Может у тебя там с размером кластера чего или еще что-то. К чему вообще обращать внимание на размер файла?

Автор: Alexey68 29.10.2013, 08:08
извиняюсь, но что-то не пойму, я изначально из hex редактора копирую в notepad++:
Код

20 00 00 00 70 65 2E 68 92 BF A1 2D 58 EB AE 68 00 B0 DE 39 1A 

, далее путём замены получаю:
Код

unsigned char mp_array[] = 0x20,0x00,0x00,0x00,0x70,0x65,0x2E,0x68,0x92,0xBF,0xA1,0x2D,0x58,0xEB,0xAE,0x68,0x00,0xB0,0xDE,0x39,0x1A};

затем сохраняю в заголовочый файл и подключаю его.
а далее пишу в цикле новый файл, наверное я изначально не так объяснил последовательность своих действий...

Автор: SVN74 29.10.2013, 09:27
Есть  " int " 16 разряд, а есть 32,  а также нет уверенности в том, что "sizeof" делает правильный промер, многое зависит от компилятора.
И вообще зачем применять цикл записи в файл, если можно просто записать весь массив в файл одной строчкой?  

"char mp_array[] "  - лучше через "new" 

Автор: vinter 29.10.2013, 09:35
Т.е. у тебя изначальный hex файл 200 кб, не результирующий заголовок?
Если так, то у тебя проблема скорее всего в 
Цитата

далее путём замены получаю:

Как ты делаешь эту замену?

Автор: feodorv 29.10.2013, 12:07
Цитата(Dem_max @  29.10.2013,  08:05 Найти цитируемый пост)
попробуй догадайся из пары строчек кода 

Вот. Как файл открывается? Нет ли с ним дополнительных телодвижений?


Цитата(vinter @  29.10.2013,  08:52 Найти цитируемый пост)
Теперь понятно почему?

Намёк не понят...


Цитата(SVN74 @  29.10.2013,  10:27 Найти цитируемый пост)
если можно просто записать весь массив в файл одной строчкой?

Ну, не "строчкой", а массивом. Почему не fwrite?


Цитата(Alexey68 @  29.10.2013,  07:57 Найти цитируемый пост)
внешней библиотеки (.h)

.h - это всё-таки заголовочный файл, не библиотека. В нём прямо вот так и написано:
Код

unsigned char mp_array[] = { ... };

или как-то иначе?


Цитата(vinter @  29.10.2013,  10:35 Найти цитируемый пост)
Как ты делаешь эту замену?

На вид один к одному, под "заменой", наверное, подразумевалось "приведение к C/C++ виду".

Автор: vinter 29.10.2013, 12:53
Цитата

Намёк не понят...

Если у него заголовок с массивом представлен в том виде, то размер заголовка(физически) будет больше чем сам массив в силу текстового представления данных в файлах исходных кодов C++.

Автор: feodorv 29.10.2013, 14:24
Цитата(vinter @  29.10.2013,  13:53 Найти цитируемый пост)
Если у него заголовок с массивом представлен в том виде

В виде
Цитата(Alexey68 @  29.10.2013,  09:08 Найти цитируемый пост)
unsigned char mp_array[] = 0x20,0x00,0x00,0x00,0x70,0x65,0x2E,0x68,0x92,0xBF,0xA1,0x2D,0x58,0xEB,0xAE,0x68,0x00,0xB0,0xDE,0x39,0x1A};

??? Он же этот массив в другой файл пихает, байт в байт...


Как вот такое может произойти
Цитата(Alexey68 @  29.10.2013,  07:57 Найти цитируемый пост)
и в дальнейшем записи в файл при размере файла в 200-300 кб, на выходе получаю размер 63,5 кб (65024)

без дополнительных плясок с файлом? 


Какая операционка? Как файл открывается/закрывается? Нет ли там fseek где-нибудь? Эти вопросы как были, так и остались неотвеченными...

Автор: Alexey68 29.10.2013, 18:17
Благодарю всех откликвнувшихся, и прошу прощения за задержку на вопросы:
вот код:
Код

#include <stdio.h>
#include <mp.h>

void main()
{
FILE *fop;
int i;
fop = fopen("mp.xxx", "wb+");

for (i = 0; i < sizeof(mp_array); i++)
{
//  printf("%d\n", i);
  fprintf(fop, "%c", mp_array[i]);
}
printf("\n\nsize = %d\n", sizeof(mp_array));
fclose(fop);

system("pause");
}

что я делаю по порядку:
1. Открываю файл в flexhex
2. копирую из него
3. вставляю в notepad++
to Vinter
>>Как ты делаешь эту замену?
поиск и замена
4. получаю файл вида:
Код

unsigned char mp_array[] = 0x20,0x00,0x00,0x00 ...............};

5. сохраняю как mp.h
6. пытаюсь побайтово записать в новый файл (сделать копию)
операционка xp
Но самое главное что даже без дальнейших манипуляций с массивом (а его размер в заголовочном файле правильный), 
если получить размер через sizeof, то результат 65024, если указываю
Код
 for (i = 0; i < 100000; i++)
, то получаю исключение на
89960 итерации...
подсвечивает:
Код

  fprintf(fop, "%c", PE_array[i]);

проверил другой файл 460кб (те же операции), всё без проблем.
как разберусь с файлом (вышеобозначенный в первом посте) напишу.

Автор: feodorv 30.10.2013, 02:11
Цитата(Alexey68 @  29.10.2013,  19:17 Найти цитируемый пост)
пытаюсь побайтово записать в новый файл (сделать копию)

Вот теперь что-то начинает прорисовывается. То есть Вы берёте файл, преобразовываете его содержимое в C-форму в виде массива байт, а затем этот массив сохраняете в другом файле?


Цитата(Alexey68 @  29.10.2013,  19:17 Найти цитируемый пост)
если получить размер через sizeof, то результат 65024
Где-то я уже видел эту цифру. Ах да:
Цитата(Alexey68 @  29.10.2013,  07:57 Найти цитируемый пост)
и в дальнейшем записи в файл при размере файла в 200-300 кб, на выходе получаю размер 63,5 кб (65024).
То есть, был изначальный файл в 300 килобайт, Вы его перевели в C-форму, записали в другой файл, размер которого внезапно 65024 байт вместо изначальных трёхсот килобайт?


Вам не приходило в голову, что C (со своей стандартной библиотекой) здесь не причём? Что размер массива реально 65024 байт для любого достаточно большого файла?
Цитата(Alexey68 @  29.10.2013,  19:17 Найти цитируемый пост)
что я делаю по порядку:
1. Открываю файл в flexhex
2. копирую из него
3. вставляю в notepad++
Есть у меня подозрение, что этот самый flexhex копирует только 65024 байт данных, либо наш доблестный виндосовский блокнот способен принимать только соответствующий объём данных, либо компилятор не выдерживает такие длинные строки; первое более вероятно. Иными словами, описанная процедура не корректна. Почему не написать аналогичную (чрезвычайно простую) программу, которая автоматически преобразует предложенный файл в C-форму с переносом строк на каждом 16 (или как там понравится) байте? С выставлением правильного размера массива, а не непонятного mp_array[].


Цитата(Alexey68 @  29.10.2013,  19:17 Найти цитируемый пост)
если указываю for (i = 0; i < 100000; i++), то получаю исключение на 89960 итерации...
При размере массива в 65024 байт цикл до 100000 означает выход за пределы массива с соответствующими последствиями...


Цитата(Alexey68 @  29.10.2013,  19:17 Найти цитируемый пост)
проверил другой файл 460кб (те же операции), всё без проблем

Как-то не верится, либо Вы изменили процедуру получения .h-файла, либо в процедуре есть ещё какие-то неведомые подводные камни)))


PS Какой размер у .h-файла при возникновении ситуации с 65024 байтами?

Автор: Alexey68 3.11.2013, 02:12
Всем огромное спасибо и прошу прощения за задержку.
В этом ли причина или нет, но после project-clean main (в меню borland c++) всё работает...
короче непонятно, но работает.
Ещё раз всем огромное спасибо.
С уважением Алексей.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)