Проверка количества инициализаторов массива

Тема в разделе "LANGS.C", создана пользователем yan2012, 11 фев 2012.

  1. yan2012

    yan2012 New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2012
    Сообщения:
    20
    реверсю одну прогу, в ней много массивов, каждый инициализируется своими данными
    нужно проверять чтобы количество инициализаторов совпадало с размерностью, иначе долго искать баги прийдётся
    как такое организовать средствами компилятора gcc-4.4?
    пробовал:
    int array[20]={0,1,34,...,67}; //вот здесь
    на один больше-меньше всё съедает компилер
    -Wall молчит
    -pedantic молчит
    что ему надо?
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Неправда. Меньше - можно, больше - нет.
    Ничего ему не надо.
    По стандарту инициализаторов может быть меньше, остальные нулями заполняются.
     
  3. yan2012

    yan2012 New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2012
    Сообщения:
    20
    спасибо, только что проверил - так и есть
    могу поделиться наброском преобразования всех чисел в файле из формата ffffffffh в формат 0x0ffffffff очень экономит время для множества данных:)
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. char arrayin[0xffffff];
    4. char arrayout[0xffffff];
    5. int main()
    6. {
    7.     FILE *fin=fopen("in","rb");
    8.     FILE *fout=fopen("out","wb");
    9.     int i=0,j=0,k=0,l=8,n=0,c;
    10.     while((arrayin[i++]=getc(fin))!=EOF);
    11.     for(;j<i;j++)
    12.     {
    13.         if((arrayin[j]==' ')||(arrayin[j]=='0')||(arrayin[j]=='1')||(arrayin[j]=='2')||(arrayin[j]=='3')||(arrayin[j]=='4')||(arrayin[j]=='5')||(arrayin[j]=='6')||(arrayin[j]=='7')||(arrayin[j]=='8')||(arrayin[j]=='9')||(arrayin[j]=='A')||(arrayin[j]=='B')||(arrayin[j]=='C')||(arrayin[j]=='D')||(arrayin[j]=='E')||(arrayin[j]=='F')||(arrayin[j]=='h')||(arrayin[j]==','))
    14.         {
    15.             if (arrayin[j]=='h')
    16.             {
    17.                 k=0;
    18.                 while((arrayin[j-k]!=' ')&&(arrayin[j-k]!=','))
    19.                 {
    20.                     arrayout[l-k+3]=arrayin[j-k];
    21.                     k++;
    22.                 }
    23.                 arrayout[l-k+1]='0';
    24.                 arrayout[l-k+2]='x';
    25.                 arrayout[l+3-k]='0';
    26.                 l+=k+3;
    27.                 arrayout[l]=',';
    28.             }
    29.         }
    30.     }
    31.     for(n=0;n<l;n++)
    32.     {
    33.         if (arrayout[n]=='h') arrayout[n]=',';
    34.         if (arrayout[n]==0) arrayout[n]='\n';
    35.         putc(arrayout[n],fout);
    36.     }
    37.  
    38.     fclose(fin);
    39.     fclose(fout);
    40.     return 0;
    41. }
    допиливать много, но в предальфа-версии покатит:)
     
  4. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.594
    Адрес:
    г. Санкт-Петербург
    ^^^^^^^^^^^^^^^^

    facepalm
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    yan2012, люди для этого fscanf() и fprintf() придумали.
     
  6. yan2012

    yan2012 New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2012
    Сообщения:
    20
    42
    или
    меняю электропроигрыватель на электровыигрыватель :)
     
  7. yan2012

    yan2012 New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2012
    Сообщения:
    20
    на самом деле fscanf поможет нам только, читать построчно или массивом нет разницы обрабатывать всё равно нужно тонко
    у меня один раз получилась нормальная версия, не такая кривая как эта, эта скорее набросок идеи, но нормальная версия была успешно потёрта, а для конкретной задачи в первом приближении хватит и этой, задача стояла не перебивать все 'h' на 0x0.