Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильный размер массива, определение длины 
V
    Опции темы
Alexey68
Дата 29.10.2013, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 10.4.2013

Репутация: нет
Всего: нет



Здравствуйте 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]);
}


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

Это сообщение отредактировал(а) Alexey68 - 29.10.2013, 06:57
PM MAIL   Вверх
Dem_max
Дата 29.10.2013, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



попробуй догадайся из пары строчек кода


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexey68
Дата 29.10.2013, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 10.4.2013

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) Alexey68 - 29.10.2013, 07:43
PM MAIL   Вверх
vinter
Дата 29.10.2013, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



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++ не умеет размер неправильно считать. Смотреть на размер файла последнее дело. Может у тебя там с размером кластера чего или еще что-то. К чему вообще обращать внимание на размер файла?



--------------------
Мой блог
PM MAIL WWW   Вверх
Alexey68
Дата 29.10.2013, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 10.4.2013

Репутация: нет
Всего: нет



извиняюсь, но что-то не пойму, я изначально из 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};

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


Это сообщение отредактировал(а) Alexey68 - 29.10.2013, 08:16
PM MAIL   Вверх
SVN74
Дата 29.10.2013, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



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

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

Это сообщение отредактировал(а) SVN74 - 29.10.2013, 10:19
PM MAIL WWW   Вверх
vinter
Дата 29.10.2013, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



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

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

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



--------------------
Мой блог
PM MAIL WWW   Вверх
feodorv
Дата 29.10.2013, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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++ виду".


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vinter
Дата 29.10.2013, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
feodorv
Дата 29.10.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 где-нибудь? Эти вопросы как были, так и остались неотвеченными...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Alexey68
Дата 29.10.2013, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 10.4.2013

Репутация: нет
Всего: нет



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

#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кб (те же операции), всё без проблем.
как разберусь с файлом (вышеобозначенный в первом посте) напишу.


Это сообщение отредактировал(а) Alexey68 - 29.10.2013, 20:38
PM MAIL   Вверх
feodorv
Дата 30.10.2013, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 байтами?

Это сообщение отредактировал(а) feodorv - 30.10.2013, 02:14


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Alexey68
Дата 3.11.2013, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 10.4.2013

Репутация: нет
Всего: нет



Всем огромное спасибо и прошу прощения за задержку.
В этом ли причина или нет, но после project-clean main (в меню borland c++) всё работает...
короче непонятно, но работает.
Ещё раз всем огромное спасибо.
С уважением Алексей.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.