Заполнение массива в С и структуры

Тема в разделе "Общие вопросы по С и С++", создана пользователем misterio, 16 май 2008.

  1. misterio

    misterio Гость

    1)Вообщем постала у меня такая нелепая проблема во время перехода с Delphi на С++ - не могу заполнить целочисленный массив:

    Код (Text):
    int mass[10];
    int i;
    ...
    for (i = 0; i<10; i++) {
    scanf("%d", mass[i]);
    }
    В итоге имеем Access Violation. Где подвох?
    И вообще как можно вместо того, чтобы писать (i < 10), написать, что-то типа... (i < /количества елеметнов mass/).

    2)

    Код (Text):
    struct man {
    char name;
    int phone;
    } me;
    ...
    me.phone = 123; //тут все ОК.
    me.name = "Жека" // а вот тут возникает ошибка. Я написал так : strcpy(me.name,"Жека") - сработало, но есть ли другой споспоб?
     
  2. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    1) Функция scanf принимает параметр типа указатель: scanf("%d", &mass); Хотя я бы написал scanf("%d", mass + i);
    Размер массива можно узнать написав sizeof(mass) / sizeof(int);

    2) Вместо char name; нужно указать char *name; (или char name[длина_строки]; ). В первом случае это будет лишь указатель на строку, а физически данные будут расположены в другом месте и если указатель ссылается на константу (как в данном случае), то строку нельзя будет изменять. Во втором случае будет выделена память под строку, но копировать можно только через strcpy или в цикле (strcpy фактически это и делает).
     
  3. misterio

    misterio Гость



    Да...точно!! В принципе так же как и обычная переменная...

    Да именно про это я и говорил, просто когда писал пост, забыл дописть размер.
    Спасибо.
     
  4. misterio

    misterio Гость

    Опять же еще 1 проблема :

    Код (Text):
    ...
    #define num 4
    ...
    void get_m (int *m[num])
    {
    register int i;

    for(i = 0; i < num; i++)
    scanf("%d", &m[i]);
    }
    ...
    int main (void)
    {
    int matrix[num];

    get_m(&matrix[num]);

    return 0;
    }
    Да..вроде бы все должно работать - передача параметра по ссылке, но после ввода 4 чисел - Access Violation.
     
  5. gamecreator

    gamecreator Гость

    попробуй
    Код (Text):
    void get_m (int m[num])
    ...
    int main (void)
    {
    ...
    get_m(matrix);
    ...
    }
     
  6. misterio

    misterio Гость

    Это вроде в С++ так? A вопрос по C,а вообще суть в том, чтобы в удаленной функции заполнился массив matrix[num], который находиться в основной и не объявлен как глобальный!
     
  7. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Кто ж так массивы передаёт?
    Код (Text):
    void get_m (int *m, int num)
    {
    register int i;

    for(i = 0; i < num; i++)
    scanf("%d", m + i);
    }

    int main (void)
    {
    int num = 4;

    int *matrix = new int[num];

    get_m(matrix, num);

    delete [] matrix;

    return 0;
    }
    Хотя вариант, предложенный gamecreator тоже будет работать. Но только если размер массива известен заранее...
     
  8. misterio

    misterio Гость

    Ну знаете...всю жизнь на Pascal..а тут на тебе столько работы с указателем.
    А это можно записать так :
    Код (Text):
    int *matrix[num];
    и какая разница? У меня слово new ассоциируется с ActionScript.
     
  9. gamecreator

    gamecreator Гость

    у меня там ошибка в обьявлении ф-ции
    void get_m (int* m)

    это массив целых указателей.
    это еще что?
     
  10. misterio

    misterio Гость

    ActionScript - язык сценариев. Используеться в основном в Macromedia Flash. Я когда - то очень давно, там делал ДАРТС - пришлось подучить немного. <<-- ФЛУД.
     
  11. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Нет, это будет другое объявление. В первом случае выделяется память под определённое число элементов типа int, а у тебя под элементы типа указатель на int. Кроме того, new выделает память во время выполнения программы.
    Моя запись равна int matrix[num];, только num должно быть константой...
     
Загрузка...

Поделиться этой страницей