Я пытаюсь получить зЬй вход для сканирования в двух параллельных 2d массивов (arrAtk, arrDef) от х строк (х < 100), а у столбцов (y < 1,000,000). Но y - это переменная длина в каждой строке.C Передача Указатель на указатель на функцию и использование таНоса
Первая строка ввода: x для количества строк в каждом массиве. Вторая строка: y Число столбцов в первой строке. После этого y целые числа, которые нужно прочитать в массиве arrAtk. Затем еще y целые числа для чтения в массив arrDef. Непосредственно следующее: int y для количества столбцов в следующих двух строках. И так далее.
Параллельные массивы будут содержать целые числа, которые будут отсортированы позже, и каждый параллельный элемент будет сравниваться, чтобы увидеть, какая из строк имела более высокие цифры.
Проблема: Поэтому я пытаюсь выполнить сканирование ввода с помощью вызова функции и динамически выделять правильный объем памяти и проверять ввод для каждой строки 2-мерных массивов. Кажется, что все работает нормально, но затем, когда я пытаюсь напечатать значения массива в главном, он сработает. Операторы printf работают в функции scanIn, поэтому я не должен правильно передавать значения. Как я могу получить его туда, где я могу использовать динамически созданные массивы вне функции?
Заранее спасибо
Пример станд ввода:
2 //<- x num of rows
2 //<- y num of cols
3
6
5
2
3 //<- y num of cols
2
3
12
9
3
4
КОД:
#include <stdio.h>
#include <stdlib.h>
int scanIn(int**,int**,int*);
int main(){
int cases, *armies, **arrAtk, **arrDef;
cases = scanIn(arrAtk,arrDef,armies);
printf("%d\n",arrAtk[1][2]); // Should be 12 with above input
printf("%d",arrDef[0][1]); // Should be 2
return 0;
}
int scanIn(int **arrAtk, int **arrDef, int *armies){
int i, j, cases;
scanf("%d",&cases);
arrAtk = (int**)malloc(sizeof(int*)*cases);
arrDef = (int**)malloc(sizeof(int*)*cases);
armies = (int*)malloc(sizeof(int)*cases);
for(i=0;i<cases;i++){
scanf("%d",&armies[i]);
arrAtk[i] = malloc(sizeof(int)*armies[i]);
arrDef[i] = malloc(sizeof(int)*armies[i]);
for(j=0;j<armies[i];j++){
scanf("%d",&arrAtk[i][j]);
}
for(j=0;j<armies[i];j++){
scanf("%d",&arrDef[i][j]);
}
}
return (cases);
}
Вам нужно пересмотреть первую строку 'main', и помните, что C * использует передачу по значению *. Запись 'arrAtk =' внутри 'scanIn' не повлияет на' arrAtk' в 'main'. (На самом деле было бы неплохо использовать разные имена переменных для параметров в 'scanIn', чтобы избежать умственного объединения двух переменных) –
В вашем коде есть несколько ошибок, которые будут генерировать сообщения компилятора. Прежде чем пытаться запустить программу, вы должны исправить все сообщения компилятора. (Не попадайте в ловушку, думая, что сообщение, содержащее слово «предупреждение», на самом деле не является ошибкой) –
Слово «double» относится к типу с плавающей точкой, поэтому «двойной указатель» будет иметь тип ' двойной * '. Используйте «указатель на указатель», а не «двойной указатель». –