Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Longard
0 / 0 / 0
Регистрация: 26.12.2015
Сообщений: 8
1

Объяснить почему не работает заполнение массива

27.12.2015, 13:43. Просмотров 266. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream>
#include <cstdio>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
 
int counting(){
 
    setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
    }
 
        cout <<"Всего строк :"<<x<<endl;
 
 
    }
    fclose(in);
    return x;
}
 
 
char* reading(int beginString, int endString, int param){
//char** str = new char*[endString - beginString];
char* str = new char[endString - beginString];
 
setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
      if(x == beginString-1 + param){
        break;
      }
    }
        cout <<"начальная строка:"<<x+1<<endl;
 
 
    }
 
 
    fgets(str, 100, in);
    fclose(in);
 
return str;
}
 
 
double* conv(char* str){
    cout<<"str[0]"<<str[0]<<endl;   /* для проверки  */ 
    cout<<"str[1]"<<str[1]<<endl;   /* для проверки  */ 
    cout<<"str[2]"<<str[2]<<endl;   /* для проверки  */ 
    cout<<"str[3]"<<str[3]<<endl;   /* для проверки  */ 
    cout<<"str[4]"<<str[4]<<endl;   /* для проверки  */ 
 
 
cout<<"попал0?"<<endl;
 
    int i = 0;
    cout<<"попал1?"<<endl;
    double k = 0;
    cout<<"попал2?"<<endl;
    double arr[5] = {(double)0.0,(double)0.0,(double)0.0,(double)0.0,(double)0.0};
 
    cout<<"arr[0] "<<arr[0]<<endl;//вот здесь крашится, не понимаю почему. Должно работать!
    cout<<"попал3?"<<endl;
    while(true){// мб цикл неправильный, но до него даже не доходит, так что дело не в нем
            cout<<"попал4?"<<endl;
    if(str[i+1] == '.'){
            cout<<"попал5?"<<endl;
k = (str[i]-48)*1000+(str[i+2]-48)*100+(str[i+3]-48)*10+str[i+4]-48;
 arr[i] = k/1000;
 cout<<"arr[i]"<<arr[i]<<endl;
 }
    if(str[i] == '\n'){break;}
    i++;
    }
 
     cout<<k<<endl;
     return arr;
}
 
 
double** toArrayConverter(int beginString, int endString){
 
    char** str = new char*[endString - beginString];
 
    double** returnStr = new double*[endString - beginString];
        for(int i = 0; i <= endString - beginString; i++){
        str[i] = reading(beginString, endString, i);
        cout<<"в обработке:"<<str[i]<<endl;
         returnStr[i] = conv(str[i]); // вот тут вызываю эту функцию
 
        }
return returnStr;
}
 
 
void sortOne(double **str){// тут еще не доделано
    for(int i = 0; i < 3; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << endl;
    }
 }
 
}
 
 
 
void sortTwo(double **str){ // тут еще не доделано
 
for(int i = 0; i < 3; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << endl;
    }
 }
 
 
}
 
int main(){
    int x, beginString, endString;
x = counting();
 
 
while(true){
     cout <<"Введите начальную строку"<<endl;
     cin>>beginString;
     cout <<"Введите конечную строку"<<endl;
     cin>>endString;
     if((x < beginString)||(endString < beginString)){
        cout <<"ошибка ввода! Попробуйте еще"<<endl;
     }
     else{break;}
}
     if(x < endString){
        endString = x;
     }
double **mass=new double*[endString - beginString];
    mass = toArrayConverter(beginString, endString);
     sortOne(mass);
     sortTwo(mass);
     return 0;
}
для меня проблема просто магическая.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
     double arr[5] = {(double)0.1,(double)0.1,(double)0.1,(double)0.1,(double)0.1};
    cout<<"arr[0]"<<arr[0]<<endl;
    return 0;
}
вот этот кусочек кода прекрасно работает будучи в отдельном проекте. Но вот в моем большом коде точно такой же кусочек кода почему-то ломается. Я не знаю почему. Как я только не пробовал его объявлять... Надежда на местных гуру осталась) (файлик input в папку к коду)

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Вложения
Тип файла: txt input.txt (171 байт, 6 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2015, 13:43
Ответы с готовыми решениями:

Объяснить, почему не работает цикл
Здравствуйте. Почему-то не работает цикл #include &lt;iostream&gt; using namespace std; int main()...

Объяснить почему выводит на экран не тот элемент массива, который ожидается
#include &lt;iostream&gt; using namespace std; int main() { int mas = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0...

Прошу объяснить мне почему я не могу задать размер массива с консоли, без его ограничения каким либо числом?
int n; int mx = 0; cin &gt;&gt; n; int a ; //не выходит это чертово n использовать...

Не работает заполнение двумерного массива
Написал процедуру заполнения двумерного массива. Не хочет работать. Тупо выдает окно с завершением...

Заполнение и сохранение массива структур не работает...
Я хочу сделать справочник кулинарных рецептов, (в него входит: название рецепта, ингредиенты(это у...

10
Croessmah
++Ͻ
15658 / 8818 / 1691
Регистрация: 27.09.2012
Сообщений: 21,721
Записей в блоге: 2
Завершенные тесты: 2
27.12.2015, 19:44 2
1.
C++
1
2
3
4
5
6
7
8
double* conv(char* str){
//...
    double arr[5] = {(double)0.0,(double)0.0,(double)0.0,(double)0.0,(double)0.0};//нафига к double приводить? 0.0 - это уже double
//...
     return arr;//Возвращаем указатель на локальную переменную
}
//...
returnStr[i] = conv(str[i]); // вот тут вызываю эту функцию, и получаете указатель на уже уничтоженные данные
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
//...
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
//...
    }
    fgets(str, 100, in);//странное решение. Если файл не открылся, то всё равно читаем из него данные.
Дальше даже не смотрел
0
olya7
499 / 312 / 235
Регистрация: 18.02.2013
Сообщений: 748
27.12.2015, 21:10 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void conv(char* str,double *arr){
 
//cout<<"попал0?"<<endl;
 
    int i = 0,j=0,k=0;
//    cout<<"попал1?"<<endl;
    //double k = 0;
  //  cout<<"попал2?"<<endl;
   // double arr[5]={0};
 
 
  //  cout<<"arr[0] "<<arr[0]<<endl;//вот здесь крашится, не понимаю почему. Должно работать!
  //  cout<<"попал3?"<<endl;
    while(str[i]!='\0'){// мб цикл неправильный, но до него даже не доходит, так что дело не в нем
          //  cout<<"попал4?"<<endl;
    if(str[i] == '.'){
            str[i]=',';
            char buf[8];
            k=i-1;
            while (isdigit(str[k]))k--;
            int nach=k+1;
 
            k=i+1;
            while (isdigit(str[k]))k++;
 
            strncpy(buf,str+nach,k-nach);
            buf[k]='\0';
 
            double s=atof(buf);
 
 
           cout<<"sum = "<<s<<endl;
           *(arr+j) =  atof(buf);
 
            cout<<"arr["<<j-1<<"]"<<*(arr+j) <<endl; j++;
 }
 
    i++;
    }
 
     cout<<"End of convert"<<endl;
 
}
0
Longard
0 / 0 / 0
Регистрация: 26.12.2015
Сообщений: 8
27.12.2015, 21:34  [ТС] 4
все что вы сказали исправил, спасибо. но проблема была не в этом. Почему вот тут
C++
1
cout<<"arr[0] "<<arr[0]<<endl;
я не могу посмотреть что лежит в arr[0]? почему падает? вот этого я не понимаю

Добавлено через 2 минуты
olya7, ваш код тоже падает... может я как-то не так вызываю эту функцию? она должна принимать на вход массив чаров, а возвращать массив даблов.
0
27.12.2015, 21:34
olya7
499 / 312 / 235
Регистрация: 18.02.2013
Сообщений: 748
27.12.2015, 21:39 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <cmath>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <stdlib.h>
using namespace std;
 
int counting(){
 
    setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
    }
 
        cout <<"Всего строк :"<<x<<endl;
 
 
    }
    fclose(in);
    return x;
}
 
 
char* reading(int beginString, int endString, int param){
//char** str = new char*[endString - beginString];
char* str = new char[endString - beginString];
 
setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
      if(x == beginString-1 + param){
        break;
      }
    }
        cout <<"начальная строка:"<<x+1<<endl;
 
 
    }
 
 
    fgets(str, 100, in);
    fclose(in);
 
return str;
}
 
 
void conv(char* str,double *arr){
 
//cout<<"попал0?"<<endl;
 
    int i = 0,j=0,k=0;
//    cout<<"попал1?"<<endl;
    //double k = 0;
  //  cout<<"попал2?"<<endl;
   // double arr[5]={0};
 
 
  //  cout<<"arr[0] "<<arr[0]<<endl;//вот здесь крашится, не понимаю почему. Должно работать!
  //  cout<<"попал3?"<<endl;
    while(str[i]!='\0'){// мб цикл неправильный, но до него даже не доходит, так что дело не в нем
          //  cout<<"попал4?"<<endl;
    if(str[i] == '.'){
            str[i]=',';
            char buf[8];
            k=i-1;
            while (isdigit(str[k]))k--;
            int nach=k+1;
 
            k=i+1;
            while (isdigit(str[k]))k++;
 
            strncpy(buf,str+nach,k-nach);
            buf[k]='\0';
 
           *(arr+j) =  atof(buf);
 
            cout<<"arr["<<j-1<<"]"<<*(arr+j) <<endl; j++;
 }
 
    i++;
    }
 
     cout<<"End of convert"<<endl;
 
}
 
 
double** toArrayConverter(int beginString, int endString){
 
    char** str = new char*[endString - beginString];
 
    double** returnStr = new double*[endString - beginString];
        for(int i = 0; i <= endString - beginString; i++){
                returnStr[i]=new double [5];
        str[i] = reading(beginString, endString, i);
        cout<<"в обработке:"<<str[i]<<endl;
        conv(str[i],returnStr[i] ); // вот тут вызываю эту функцию
 
        }
 
return returnStr;
}
 
 
void sortOne(double **str,int n){// тут еще не доделано
    for(int i = 0; i < n; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << endl;
    }
 }
 
}
 
 
 
void sortTwo(double **str,int n){ // тут еще не доделано
 
for(int i = 0; i < n; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << endl;
    }
 }
 
 
}
 
int main(){
    int x, beginString=2, endString=3;
x = counting();
 
 
while(true){
     cout <<"Введите начальную строку"<<endl;
     //cin>>beginString;
     cout <<"Введите конечную строку"<<endl;
     //cin>>endString;
     if((x < beginString)||(endString < beginString)){
        cout <<"ошибка ввода! Попробуйте еще"<<endl;
     }
     else{break;}
}
     if(x < endString){
        endString = x;
     }
double **mass=new double*[endString - beginString];
    mass = toArrayConverter(beginString, endString);
    cout<< "mass in main is initi"<<endl;
     sortOne(mass,endString - beginString);
     sortTwo(mass,endString - beginString);  delete []mass;
     return 0;
 
}
0
Longard
0 / 0 / 0
Регистрация: 26.12.2015
Сообщений: 8
27.12.2015, 22:12  [ТС] 6
чувствую себя идиотом... Я все равно не могу посмотреть, что лежит в массиве. просто вывести на экран, почему не получается?
C++
1
2
3
double **mass=new double*[endString - beginString];
    mass = toArrayConverter(beginString, endString);
    cout<< "mass in main is initi"<<endl;
вот здесь, если попытаться вывести на экран mass[0][0] все падает. то есть ошибка осталась, просто переехала ниже. И я не понимаю что это за ошибка
0
olya7
499 / 312 / 235
Регистрация: 18.02.2013
Сообщений: 748
27.12.2015, 22:28 7
это у меня не крашится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <iostream>
#include <cmath>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <stdlib.h>
using namespace std;
 
int counting(){
 
    setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
    }
 
        cout <<"Всего строк :"<<x<<endl;
 
 
    }
    fclose(in);
    return x;
}
 
 
char* reading(int beginString, int endString, int param){
//char** str = new char*[endString - beginString];
char* str = new char[endString - beginString];
 
setlocale(LC_ALL,".1251");
         FILE *in = fopen("input.txt","r");
int c, x = 0;
         if(in==NULL)
         {
             cout<<"Ошибка в открытии файла"<<endl;
         }
         else
         {
 
             while (c != EOF)
    {
      c = fgetc(in);
      if (c == '\n') {
            x++;
      }
      if(x == beginString-1 + param){
        break;
      }
    }
        cout <<"начальная строка:"<<x+1<<endl;
 
 
    }
 
 
    fgets(str, 100, in);
    fclose(in);
 
return str;
}
 
 
void conv(char* str,double *arr){
 
//cout<<"попал0?"<<endl;
 
    int i = 0,j=0,k=0;
//    cout<<"попал1?"<<endl;
    //double k = 0;
  //  cout<<"попал2?"<<endl;
   // double arr[5]={0};
 
 
  //  cout<<"arr[0] "<<arr[0]<<endl;//вот здесь крашится, не понимаю почему. Должно работать!
  //  cout<<"попал3?"<<endl;
    while(str[i]!='\0'){// мб цикл неправильный, но до него даже не доходит, так что дело не в нем
          //  cout<<"попал4?"<<endl;
    if(str[i] == '.'){
            str[i]=',';
            char buf[8];
            k=i-1;
            while (isdigit(str[k]))k--;
            int nach=k+1;
 
            k=i+1;
            while (isdigit(str[k]))k++;
 
            strncpy(buf,str+nach,k-nach);
            buf[k]='\0';
 
           *(arr+j) =  atof(buf);
 
            cout<<"arr["<<j<<"]"<<*(arr+j) <<endl; j++;
 }
 
    i++;
    }
 
     cout<<"End of convert"<<endl;
 
}
 
 
double** toArrayConverter(int beginString, int endString){
 
    char** str = new char*[endString - beginString];
 
    double** returnStr = new double*[endString - beginString];
        for(int i = 0; i <= endString - beginString; i++){
                returnStr[i]=new double [5];
        str[i] = reading(beginString, endString, i);
        cout<<"в обработке:"<<str[i]<<endl;
        conv(str[i],returnStr[i] ); // вот тут вызываю эту функцию
         cout<<"returnStr : ";
         for(int j = 0; j < 5; j++){
       cout << returnStr[i][j] << "\t";
    }
    cout  << endl;
 
        }
 
return returnStr;
}
 
 
void sortOne(double **str,int n,int m){// тут еще не доделано
for(int i = n; i <= m; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << "\t";
    }
    cout  << endl;
 }
}
 
 
 
void sortTwo(double **str,int n,int m){ // тут еще не доделано
 
for(int i = n; i <= m; i++){
            for(int j = 0; j < 5; j++){
       cout << str[i][j] << "\t";
    }
    cout  << endl;
 }
 
 
}
 
int main(){
    int x, beginString=1, endString=5;
x = counting();
 
 
while(true){
     cout <<"Введите начальную строку"<<endl;
     //cin>>beginString;
     cout <<"Введите конечную строку"<<endl;
     //cin>>endString;
     if((x < beginString)||(endString < beginString)){
        cout <<"ошибка ввода! Попробуйте еще"<<endl;
     }
     else{break;}
}
     if(x < endString){
        endString = x;
     }
double **mass=new double*[endString - beginString];
    for (int i=0;i<endString - beginString;i++)
        mass[i]=new double[5];
    mass = toArrayConverter(beginString, endString);
    cout<< "mass in main is initi"<<endl;
    cout<< "sortOne"<<endl;
     sortOne(mass,beginString-1, endString-1);
     cout<< "sortTwo"<<endl;
     sortTwo(mass,beginString-1, endString-1);  delete []mass;
     return 0;
 
}
0
Вложения
Тип файла: txt input.txt (172 байт, 1 просмотров)
Longard
0 / 0 / 0
Регистрация: 26.12.2015
Сообщений: 8
27.12.2015, 22:38  [ТС] 8
у меня падает. Ща попробую перезапустить кодблокс. Но видимо магия
0
avgoor
1049 / 616 / 158
Регистрация: 05.12.2015
Сообщений: 1,754
27.12.2015, 22:55 9
Цитата Сообщение от olya7 Посмотреть сообщение
double **mass=new double*[endString - beginString];
Вот вы выделили массив указателей на double. На что они указывают?
Кто будет выделять память? (mas[i]=new double[size]).

И, еще, если что-то выделяли, обязательно надо удалять!
0
olya7
499 / 312 / 235
Регистрация: 18.02.2013
Сообщений: 748
28.12.2015, 07:54 10
avgoor, 179-181 строчка и удаление 187
0
avgoor
1049 / 616 / 158
Регистрация: 05.12.2015
Сообщений: 1,754
28.12.2015, 18:00 11
Цитата Сообщение от olya7 Посмотреть сообщение
avgoor, 179-181 строчка и удаление 187
Тут погорячился, но вообще char** там выделять именно так очень не рекомендуется, ну да бог с ним.

строчка 40:
Цитата Сообщение от olya7 Посмотреть сообщение
char* str = new char[endString - beginString];
строчка 68:
Цитата Сообщение от olya7 Посмотреть сообщение
fgets(str, 100, in);
пусть endString-beginString==5;
Как вы в char[5] запихаете 100 байт из файла?
0
28.12.2015, 18:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2015, 18:00

Исправить код и объяснить почему не работает
Почему норм не компилируется? если i сделать real, то норм? Program Add; Procedure Main; var...

Объяснить, почему программа для подсчёта скобок в тексте работает не так, как ожидается
я ввожу текст в блокноте с скобками, мне нужно подсчитать количество скобок в программе, но у меня...

кто может объяснить,почему на моем компе программа работает на других нет?код в Delphi
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru