Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заполнение массива в С и структуры
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
misterio
1)Вообщем постала у меня такая нелепая проблема во время перехода с Delphi на С++ - не могу заполнить целочисленный массив:

int mass[10];
int i;
...
for (i = 0; i<10; i++) {
     scanf("%d", mass[i]);
     }


В итоге имеем Access Violation. Где подвох?
И вообще как можно вместо того, чтобы писать (i < 10), написать, что-то типа... (i < /количества елеметнов mass/).

2)

struct man {
   char name;
   int phone;
   } me;
...
me.phone = 123; //тут все ОК.
me.name = "Жека" // а вот тут возникает ошибка. Я написал так : strcpy(me.name,"Жека") - сработало, но есть ли другой споспоб?
shisik
1) Функция scanf принимает параметр типа указатель: scanf("%d", &mass[i]); Хотя я бы написал scanf("%d", mass + i);
Размер массива можно узнать написав sizeof(mass) / sizeof(int);

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


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

Цитата
char name[длина_строки]


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

...
#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.
gamecreator
попробуй
void get_m (int m[num])
...
int  main (void)
{
...
   get_m(matrix);
...
}
misterio
Это вроде в С++ так? A вопрос по C,а вообще суть в том, чтобы в удаленной функции заполнился массив matrix[num], который находиться в основной и не объявлен как глобальный!
shisik
Кто ж так массивы передаёт?
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 тоже будет работать. Но только если размер массива известен заранее...
misterio
Цитата
Кто ж так массивы передаёт?


Ну знаете...всю жизнь на Pascal..а тут на тебе столько работы с указателем.
Цитата
int *matrix = new int[num];

А это можно записать так :
int *matrix[num];

и какая разница? У меня слово new ассоциируется с ActionScript.
gamecreator
у меня там ошибка в обьявлении ф-ции
void get_m (int* m)

Цитата(misterio @ 19:05:2008, 18:42 ) *
int *matrix[num];
это массив целых указателей.
Цитата(misterio @ 19:05:2008, 18:42 ) *
У меня слово new ассоциируется с ActionScript.
это еще что?
misterio
ActionScript - язык сценариев. Используеться в основном в Macromedia Flash. Я когда - то очень давно, там делал ДАРТС - пришлось подучить немного. <<-- ФЛУД.
shisik
Цитата(misterio @ 19:05:2008, 18:42 ) *
А это можно записать так :
int *matrix[num];

и какая разница? У меня слово new ассоциируется с ActionScript.

Нет, это будет другое объявление. В первом случае выделяется память под определённое число элементов типа int, а у тебя под элементы типа указатель на int. Кроме того, new выделает память во время выполнения программы.
Моя запись равна int matrix[num];, только num должно быть константой...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.