Си. Функция, возвращающаяя указатель на массив.
Я сделал вот так, но массив содержит какую-то ерунду.
int func(FILE *file);
int main(){
FILE *file,*file2;
int str[20],c,l;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
*str=func(file);
l=str[19];
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
int func(FILE *file){
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ str[l]=a+b; l+=1;}
}
str[19]=l;
return *str;
}
int func(FILE *file);
int main(){
FILE *file,*file2;
int str[20],c,l;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
*str=func(file);
l=str[19];
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
int func(FILE *file){
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ [COLOR="Red"]str[l][/COLOR]=a+b; l+=1;}
}
[COLOR="Red"]str[19]=l; // массив str объявлен в main, здесь не виден[/COLOR]
return *str;
}
#include "stdio.h" // правильно #include <stdio.h>
Из-за этого ошибки быть не может. Имена заголовочных файлов можно писать и в кавычках.
int func(FILE *file);
int main(){
FILE *file,*file2;
int str[20],c,l;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
*str=func(file);
l=str[19];
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
int func(FILE *file){
int a,b,l,str[20];
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ str[l]=a+b; l+=1;}
}
str[19]=l;
return *str;
}
так тоже не хочет работать...
Я так понимаю, что ровно одно число должно быть меньше нуля, поэтому попробуйте заменить Ваше условие
например на такое
Также, как вариант решения, сделайте возвращаемый тип Вашей функции void, а указатель на массив передайте в качестве параметра.
Также, как вариант решения, сделайте возвращаемый тип Вашей функции void, а указатель на массив передайте в качестве параметра.
А как это?
Компилится, работает, но в файл ничего не пишет. Пробовал в разных местах программы выводить на экран элементы массива str, в функции все элементы правильные, а возвращаемые ей значения совсем не такие, какие должны быть.
Если вы про первый вариант программы, по которому я сделал замечания, то я очень удивлен если он у вас компилится. Насчет "stdio.h", muturgan может и прав, но из-за отсутствия str точно должно было не компилиться.
И второй вариант вы кстати неправильно сделали - объявили локальный массив внутри функции, который просто исчезает после завершения работы функции.
Да и функция у вас возвращает не "указатель на массив", а просто значение int, которое вы вот здесь:
присваиваете первому элементу массива str.
Полагаю примерно это имелось в виду:
void func(FILE *file, int *str);
int main(){
FILE *file,*file2;
int str[20],c,l;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
func(file, str);
l=str[19];
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
void func(FILE *file, int *str){
int a,b,l;
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ str[l]=a+b; l+=1;}
}
str[19]=l;
}
Update. И еще я заметил, что вы в циклах отсчет переменных, используемых в качестве индексов для обхода элементов массивов, начинаете с единицы [noparse](c = 1; l = 1;)[/noparse]. Может быть, лучше начинать с нуля?
Да, первый вариант не компилится. Даже не знаю откуда я его взял, может быть скопировал из какого-то промежуточного варианта программы.
Сделал отсчет с нуля для переменных, используемых в циклах. Да, так лучше.
Еще вопрос: чтобы присваивать значение массиву, а не первому его элементу, нужно писать без указателя?
Если вы имеете в виду под "присваивать значение массиву" следующее: есть два массива, и нужно присвоить каждому элементу одного массива значение соответственного (по номеру индекса) элемента другого массива, то сделать это одной операцией "=" нельзя, нужно поэлементно выполнить присваивание.
Применительно к вашей задаче - можно использовать создание массива динамически. Внутри функции func можно создать массив динамически (через функцию malloc если в C, если в C++ - то можно также через оператор new), создав указатель, выделив область памяти (через malloc / new) и установив указатель на начало этой области, а затем работая с указателем как будто это массив. И потом вернуть значение указателя как результат выполнения функции:
#include <stdlib.h>
int* func(FILE *file, int size);
int main(){
FILE *file,*file2;
int c, l, maxSize = 20;
int *str;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
str = func(file, maxSize);
l=str[maxSize - 1];
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
int* func(FILE *file, int size){
int a,b,l;
int *str = (int*)malloc(size * sizeof(int));
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ str[l]=a+b; l+=1;}
}
str[size - 1]=l;
return str;
}
И вообще - похоже вы очень слабо представляете как организована работа с массивами и указателями (хотя бы судя по вашему выражению "писать без указателя"), советую получше почитать в учебнике про массивы, указатели, и как массивы связаны с указателями.
Возвращаемое функцией значение - это только str[0].
См. комментарии.
int func(FILE *file);
int main(){
FILE *file,*file2;
int str[20],c,l;
file=fopen("C:/lab/1.txt","r");
file2=fopen("C:/lab/2.txt","w");
c=1;
*str=func(file); [COLOR="Blue"]// *str - это начальный элемент массива[/COLOR]
// [COLOR="Red"] *str это то же самое что str[0][/COLOR]
l=str[19];
[COLOR="Blue"]// кроме str[0] функция func никак не меняет значения массива str (того, который в main )
// str[], объявленный в main, и str[], объявленный в func - [/COLOR][COLOR="Red"]это разные массивы[/COLOR]
while (c<l){
if (c+1==l) fprintf(file2,"%d.",str[c]); else fprintf(file2,"%d,",str[c]);
c+=1;
}
}
int func(FILE *file){
int a,b,l,str[20];
l=1;
while (fscanf(file,"%d %d",&a,&b)!=EOF){
printf("%d %d\n",a,b);
if (a<0 || b<0){ str[l]=a+b; l+=1;}
}
str[19]=l;
[COLOR="Blue"]// Вы записываете числа в локальный массив str[]
// После выхода из функции этот массив перестаёт существовать[/COLOR]
return *str;
}