Я могу сделать что-то вроде этого? Это будет работать?
double *vec_subtraction (char *a, char *b, int n)
{
double *result;
int i;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
return result;
}
и затем в основном:
double *vec=vec_substraction(a, b, n);
for(i=1; i<n; i++)
printf("%d", vec[i]);
a и b являются векторами с тем же числом элементов, n является числом элементов.
Да, вы можете, но вам нужно выделить память для результат
где-то.
В основном вы можете выделить память внутри VEC_Subtraction
или снаружи или снаружи
VEC_SUBTRaction
, если вы выделите снаружи, вы выделите это статус или динамически.
Если вы собираетесь выделить внутри:
double *vec_subtraction (char *a, char *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
return result;
}
и в главном:
double *vec;
// ...
vec = vec_subtraction(a, b, n);
// ...
free(vec);
не забывайте на бесплатно
результат вызова VEC_SUBTRICTION
когда-то позже.
Если вы собираетесь выделить снаружи, вам нужно пройти у указателя на память:
void vec_subtraction (char *a, char *b, int n, double *result) {
int i;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
}
в главном:
// choose one of:
// double *vec = malloc(sizeof(double)*n);
// double vec[10]; // where 10= n.
vec_subtraction(a, b, n, vec);
// if you used *vec = malloc... remember to call free(vec).
Не так. Вам необходимо выделить память либо в стеке, прежде чем вызывать функцию или на куче из функции.
double *vec_subtraction( ... ) {
double *result = malloc(sizeof(double)*n);
...
return result;
}
Тогда остальные будут работать. Вы должны запомнить, чтобы освободить память, хотя.
Другой вариант:
void vec_subtraction( ..., double *result ) {
...
}
тогда в главном:
double result[n];
vec_subtraction(..., result);
Вы можете, но вы не кажены Чтобы выделить любую память для вектора результата.
Вы можете вернуть двойную * из функции. Просто убедитесь, что указатель все еще указывает на действительный объект. например Не делай этого:
double *vec_subtraction (char *a, char *b, int n) {
double result[n];
int i;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
return &result[0]; //error,the local array will be gone when the function returns.
}
Это было бы в порядке, хотя:
double *vec_subtraction (char *a, char *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
if(result == NULL)
return NULL;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
return result; //remember to free() the returned pointer when done.
}
В вашей функции VEC_SUBTRACTE у вас есть неинициализированная переменная в двойном * результате. Если вы хотите, чтобы это вернуть что-то значимое, вам нужно выделить некоторую память в массив, например,
result = malloc(sizeof(double) * n);
Тогда вы должны помнить, чтобы освободить его, когда вы закончите:
free(vec);
Тем не менее, хорошая практика (по крайней мере, когда я был C-Coder), заключался в памяти Alloc и бесплатная память в том же объеме, где это возможно курс. Так что на самом деле вы должны пройти свой массив в свою функцию VEC_SUBTRaction. Вам нужно будет изменить подпись вашей функции на:
vec_subtraction (char *a, char *b, int n, double *result)
, позвонив на это так:
double vec[n];
...
vec_subtraction (a, b, n, &result);
Извините в мой псевдо-C, но, надеюсь, вы получите идею.
Удачи!
Вы можете сделать что-то , как это, пока это не слишком много , как это. В частности, вам необходимо убедиться, что вы обрабатываете время всю память разумно.
Довольно немногие другие указали, что вам нужно выделить пространство для вашего результата, поэтому я не буду вступить в эту часть. Есть несколько других моментов, чтобы подумать, хотя.
Прямо сейчас вы определили A
и B
в качестве указателей на CHAR, но вы наличия функции возвращают указатель на двойной. Это безвредно, но, вероятно, бессмысленно и расточительно. Что намного хуже, это то, что вы тогда передаете эти два удваивания printf
с преобразованием «% d», поэтому он пытается лечить как целые числа вместо удваиваний (вы будете печатать двойной с «% F "). Результатом в этом случае является неопределенным поведением.
Это будет работать, если вы выделите любую память для результатов:
result = malloc(sizeof(*result) * n);
, и теперь это становится ответственностью вызывающего абонента, чтобы освободить эту память.
Вызывающий также может пройти двойной массив, который будет заполнен результатами, и в этом случае вы можете использовать не использовать динамически выделенный массив.