• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Заполнение многомерного массива по ссылке

  • Автор темы misterio
  • Дата начала
M

misterio

Вот, вчера методом научного тыка и интуиции написал, заполнение одномерного массива по ссылке :
(с моим 2-ух недельным знанием С.)


Код:
void FillMatrix(int *matrix[]);

int main(void)
{
int *matrix[3];

FillMatrix(matrix);
getch(); 

return 0;
}

void FillMatrix(int *matrix[]) //передача массива по ссылке.
{
register int i;

for (i = 0; i < 3; i++) {
scanf("%i", matrix+i);

}
}

Дак вот как быть с многомерным массивом?
 
D

Dimmuborgir

Код:
void FillMatrix(int *matrix[]) //передача массива по ссылке.
Здесь вы передаете указатель на массив, а не ссылку.
 
S

shisik

И здесь объявляется не массив целых чисел, а массив указателей на int:
Код:
int *matrix[3];
 
M

misterio

Эмм...ну значит я неправильно выразился, думаю понятно почему.

Дак вот как замутить многомерный(двухмерный) массив таким споспбом, или аналогичным. Чтобы суть осталась неизменной!

Я так понял правильней надо было написать так?

Код:
void fill(int *m);

int main(void)
{
int i,matrix[3];
fill(&matrix);

//проверочка
for (i = 0; i < 3; i++) {
printf("%i\n",*(matrix+i));
}

return 0;
}
void fill(int *m)
{
int i;

for (i = 0; i < 3; i++) {
scanf("%i", m+i);
}
}
 
D

Dimmuborgir

Код:
void fill(double**,int,int);

int main(void)
{
const int row=3;
const int col=3;
double matrix[row][col];

fill(matrix,row,col);

return 0;
}
void fill(double**m,int r,int c)
{
for (int i = 0; i<r; i++) 
for (int j = 0; j<c; j++)
scanf("'m[%i,%i]=%f",i,j, m[i][j]);
}
 
S

shisik

misterio
только не fill(&matrix); а fill(matrix); Имя массива = его адрес, т.е. адрес первого элемента. В данном случае matrix аналогично &matrix[0]
 
M

misterio

только не fill(&matrix); а fill(matrix); Имя массива = его адрес, т.е. адрес первого элемента. В данном случае matrix аналогично &matrix[0]

Спасибо. Я об этом читал - "...считаеться плохим стилем программирования..", но в силу своей неопытности в С - я думаю мне позволено.
 
S

shisik

Спасибо. Я об этом читал - "...считаеться плохим стилем программирования..", но в силу своей неопытности в С - я думаю мне позволено.
Что считается плохим стилем? &matrix в данном случае даже не скомпилируется (по крайней мере gcc ругается), т.к. ты пытаешься взять адрес адреса, что есть бред (это ж не переменная-указатель, адрес массива - константа). Такая запись примерно аналогична &123.
 
M

misterio

данном случае даже не скомпилируется (по крайней мере gcc ругается)

gcc штука противная- ИМХО.

для начала с меня GodeGear RAD C++ Builder хватает.
 
M

misterio

со своим билдером вам сюда https://codeby.net/threads/23195.html это раз.

Читайте топик внимательней. Вопрос из ряда общих. А в таком тоне и не в тему прошу не писать.

не путаем ИДЕ и компилятор это два

Я не путаю. Хотел бы я посмотреть на вас с двухнедельним знанием С.

Прошу топик считать закрытым.
 
D

dpi

// Динамический захват и освобождение памяти
[codebox]
double *a; // Одна переменная
double *d; // Массив переменных
double **dd; // Двухмерный массив

void GetMem()
{ // Захват памяти
a = new double; // Одна переменная
d = new double[4]; // Массив переменных
dd = new double*[3]; // Двухмерный массив
for(int i = 0; i< 3; i++)
dd = new double[2];
// Присвоение
*a = 1.0; // Одна переменная
cout << "a = " << *a << endl;
cout << "Address of a = " << a << endl;

// Массив переменных
cout << "Array starts from " << d << " and has\n";
for(i = 0; i < 4; i++)
{
d = double(i);
cout << "d[" << i << "] = " << d << endl;
}

cout << "2D array starts from " << dd << " and has\n";
for(i = 0; i < 3; i++, cout << endl) // Двухмерный массив
for(int j = 0; j < 2; j++)
{
dd[j] = (double)(i + j);
cout << "dd[" << i << "][" << j << "] = " << dd[j] << endl;
}
}

void FreeMem()
{ // Освобождение памяти
delete a; // Одна переменная
delete [] d; // Массив переменных
for(int i = 0; i < 3; i++) // Двухмерный массив
delete [] dd;
delete [] dd;
}[/codebox]
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!