Форум программистов, компьютерный форум CyberForum.ru

Передача массива в функцию используя указатель на функцию - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Select option консольная команда http://www.cyberforum.ru/cpp-beginners/thread1508212.html
здравствуйте. как можно сделать в консольной команде например: в php HTMl кодах используется <select> и <option> + simbut и в C++ возможно ли сделать такой запрос как select Option только без simbut
C++ Вылетает программа при заполнении массива Добрый день. Решил написать простой код отрисовки карты в консоли. Идея: 1.Создаю объект структуры, содержащий перечень координат в массивах coorx и coory и графическое обозначение 2.Передаю значения координат в ключи массива map и присваиваю ячейке соответственное граф.обозначение Проблема: Для теста решил заполнить массивы coorx и coory на всю ширину и высоту карты. Но, в результате... http://www.cyberforum.ru/cpp-beginners/thread1508177.html
Вращение координаты вокруг точки C++
на входе x, y координаты точки которую нужно вращать и x, y координаты точки во круг которой происходит вращение, также есть угол в градусах ( диапазон от -180* до 180* ) есть форма 300 на 300 нужно чтобы точка во круг которой происходит вращение находилась в центре формы ( 150, 150 ), а остальные точки вращались относительно нее получаю точку во круг которой нужно вращать( диапазан от...
Синхронизация потоков C++
Есть статический класс к которому я хочу обращаться из разных потоков static class MyLog { public: static int log(std::string, int type); }; Внутри написал так
C++ Отправить POST запрос http://www.cyberforum.ru/cpp-beginners/thread1508052.html
Помогите уже, реально задолбался, 2 дня уже ищу рабочий код который бы отправлял пост запрос но никак не могу найти. Везде какие-то либы или паки исходников которые нужно проинсталлить, но даже после инсталла вроде бы код рабочий, но при компиляции выдает кучу ошибок а-ля "ссылка на неразрешенный внешний символ и т.п." Нашел для GET запроса - http://www.cyberforum.ru/post4743606.html . Автор...
C++ CMenu::InsertMenu - обработка сообщения Привет всем, Подскажите, пожалуйста, как обработать сообщение CMenu::InsertMenu посылаемое из внешнего приложения? Resource.h #define ID_EXPCATXML 100 Plugin.h подробнее

Показать сообщение отдельно
Ваю
15 / 15 / 1
Регистрация: 21.04.2015
Сообщений: 504
01.08.2015, 13:35     Передача массива в функцию используя указатель на функцию
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки с помощью указателя. Имеется 3 функции ввода и 1 обработки, при вводе не из файла в качестве отсутствующих параметров можно добавить (..., NULL, "") дабы был один формат

Без указателей объявления такие:

C++
1
2
3
4
5
int InpKbdArr(__int16 * & Arr, unsigned int & SizeW, unsigned int & SizeH); //клава
int GenRndArr(__int16 * & Arr, unsigned int & SizeW, unsigned int & SizeH); //рандом
int FReadArr (__int16 * & Arr, unsigned int & SizeW, unsigned int & SizeH, FILE* & fArr, char * & Arr_txt); //файл
 
int MaxInStr (__int16 * & Arr, unsigned int & SizeW, unsigned int & SizeH, __int16 * & ArrX);
У меня имеются примеры работы с указателями, более-менее понятно что там происходит, но как сделать для моего задания я не знаю.

Вся программа целиком:
Кликните здесь для просмотра всего текста
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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <sys\stat.h>
#include <sys\types.h>
using namespace std;
 
void InputData (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight, 
    FILE* & fArr, char* & Arr_txt, unsigned int & ReadFileArr);
int  InpKbdArr (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight);
int  GenRndArr (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight);
void PrintArr  (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight);
int  FWriteArr (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight, 
    FILE* & fArr, char* & Arr_txt);
int  FReadArr  (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight, 
    FILE* & fArr, char* & Arr_txt);
int  MaxInStr  (__int16* & Array, unsigned int & SizeWidth, unsigned int & SizeHeight, __int16* & ArrX);
void PrintArrX (__int16* & ArrX,                                                        unsigned int & SizeHeight);
int  FWrtArrX  (__int16* & ArrX,  unsigned int & SizeHeight,                             FILE* & fArrX, char* & ArrX_bin);
int  FReadArrX (__int16* & ArrX,  unsigned int & SizeHeight,                             FILE* & fArrX, char* & ArrX_bin);
void SearchMin (__int16* & ArrX,                                                        unsigned int & SizeHeight, __int16  & Min);
 
void main() {
    setlocale(0, "ru-ru"); srand((unsigned int)time(0));
     
    FILE *fArr = NULL, *fArrX = NULL; char *Arr_txt = "Arr.txt", *ArrX_bin = "ArrX.bin"; 
    __int16 *Arr = NULL, *ArrX = NULL, Min = numeric_limits<__int16>::max(); 
    unsigned int SizeW = 0, SizeH = 0, ReadFileArr = 0; 
 
    InputData(Arr, SizeW, SizeH, fArr, Arr_txt, ReadFileArr); //Ввод размера массива с клавиатуры или рандом
    if (!Arr) { //Если массив не был получен
        if (InpKbdArr(Arr, SizeW, SizeH)) //Ввод значений массива с клавиатуры или рандом
            GenRndArr(Arr, SizeW, SizeH); //Генерация случайого массива
    }
    if (Arr) { //Если массив был получен
        if (!ReadFileArr) { //не из файла
            PrintArr(Arr, SizeW, SizeH); //Вывести массив Arr на экран
            FWriteArr(Arr, SizeW, SizeH, fArr, Arr_txt); //Сохранение в текстовый файл массива Arr
        }
        //Поиск максимума в каждой строке массива Arr и сохранение в отдельный массив ArrX
        if (!MaxInStr(Arr, SizeW, SizeH, ArrX)) { //Если удалось выделить память для ArrX
            
            if (FWrtArrX(ArrX, SizeH, fArrX, ArrX_bin) < 2) //Сохранение в бинарный файл
                FReadArrX(ArrX, SizeH, fArrX, ArrX_bin); //Чтеие из бинарного файла
 
            PrintArrX(ArrX, SizeH); //Вывести массив ArrX на экран
 
            SearchMin(ArrX, SizeH, Min); //Поиск в масиве X минимального Y > 0 с помощью рекурсии
            free(ArrX); ArrX = NULL;
 
        } free(Arr); Arr = NULL;
    } 
    else puts("Не удалось считать исходный массив...");
 
    puts(""); system("pause");
}
 
void InputData(__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH, FILE* & fArr, 
    char* & Arr_txt, unsigned int & Flag)
{
    char *Err1, *Err2, Tmp1[23], Tmp2[23]; SizeW = 0, SizeH = 0;
 
    do { do { Flag = 0; 
            printf("Ширина и высота массива [5..65535 или * или f f]: "); 
            scanf_s("%22s %22s", Tmp1, 23, Tmp2, 23);
            if (strlen(Tmp1) > 5 || strlen(Tmp2) > 5) {
                Flag = 1; puts("Корявый ввод");
            }
        } while (Flag);
 
        _strlwr(Tmp1); _strlwr(Tmp2);
        if (*Tmp1 == 'f' && *Tmp2 == 'f' && strlen(Tmp1) == 1 && strlen(Tmp2) == 1) {
            FReadArr(Arr, SizeW, SizeH, fArr, Arr_txt); Flag = 2; break; //Чтение из текстового файла массива Arr
        }
        
        SizeW = strtol(Tmp1, &Err1, 10);
        if ((SizeW < 5) || (Err1 == Tmp1 && *Tmp1 == '*' && strlen(Tmp1) == 1)) {
            SizeW = 6 + rand() % 6;
        }
        else { if (Err1 == Tmp1) Flag = 1; }
 
        SizeH = strtol(Tmp2, &Err2, 10);
        if ((SizeH < 5) || (Err2 == Tmp2 && *Tmp2 == '*' && strlen(Tmp2) == 1)) {
            SizeH = 10 + rand() % 11;
        }
        else { if (Err2 == Tmp2) Flag = 1; }
 
        if (Flag) { puts("Корявый ввод"); }
        else {
            if (SizeW > 65535) SizeW = 65535;
            if (SizeH > 65535) SizeH = 65535;
        }
 
    } while (Flag);
 
    printf("Ширина: %d ; Высота: %d\n\n", SizeW, SizeH); fflush(stdin);
}
 
int  InpKbdArr(__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH)
{
    __int16 *ArrTmp = NULL, *ArrNew = NULL; unsigned int i, j, Flag; 
    char *Err1, Tmp1[23]; int Tmp2 = 0;
 
    ArrNew = (__int16*)realloc(ArrTmp, SizeW * SizeH * sizeof(*ArrTmp));
    if (ArrNew == NULL) { 
        free(ArrTmp); ArrTmp = NULL; puts("Ошибка памяти"); system("pause"); /*exit(1);*/ }
    else { Arr = ArrNew; j = 0; puts("Введите элементы масива [-32768..32767 или * или **]:");
 
    while (j < SizeH) { i = 0;
        while (i < SizeW)   {   
    
    do { do {   Flag = 0; printf("[%d; %d].. : ", j, i); scanf_s("%22s", Tmp1, 23);
        if (strlen(Tmp1) > 6) { Flag = 1; puts("Корявый ввод"); }
        } while (Flag);
 
        Tmp2 = strtol(Tmp1, &Err1, 10);
        if (Err1 == Tmp1 && *Tmp1 == '*' && strlen(Tmp1) == 1) {
            Tmp2 = 32767 - rand() % 65535;
        }
        else { if (Err1 == Tmp1) Flag = 1; }
 
        if (Flag == 1 && Tmp1[0] == '*' && Tmp1[0] == '*' && strlen(Tmp1) == 2) {
            puts("Будет сгенерирован случайный массив заданного размера."); 
            free(Arr); Arr = NULL; system("pause"); goto ExitFoo_InpKbdArr;
        }
        
        if (Flag) { puts("Корявый ввод"); }
        else {
            if (Tmp2 > +32767) { Tmp2 = +32767; printf("Коррекция вода: %d \n", Tmp2); }
            if (Tmp2 < -32768) { Tmp2 = -32768; printf("Коррекция вода: %d \n", Tmp2); }
        }
 
    } while (Flag);
 
    Arr[j * SizeW + i] = Tmp2; i++; } j++; } }
 
ExitFoo_InpKbdArr:
    puts("");
    if (Arr) { return 0; } else { return 1; }
}
 
int  GenRndArr(__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH)
{
    __int16 *ArrTmp = NULL, *ArrNew = NULL; unsigned int i, j = 0; 
 
    ArrNew = (__int16*)realloc(ArrTmp, SizeW * SizeH * sizeof(*ArrTmp));
    if (ArrNew == NULL) { 
        free(ArrTmp); ArrTmp = NULL; perror("Ошибка памяти"); system("pause"); /*exit(1);*/ }
    else { Arr = ArrNew;
 
        while (j < SizeH) { i = 0;
            while (i < SizeW)   { Arr[j * SizeW + i] = 127 - rand() % 256; i++; } j++;
        } 
    }
 
    if (Arr) { return 0; } else { return 1; }
}
 
void PrintArr (__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH)
{
    unsigned int i, j = 0;
 
    while (j < SizeH) { i = 0;
        while (i < SizeW) { printf("%6d ", Arr[j * SizeW + i]); 
            if ((i+1) % 11 == 0) puts(""); i++;
        } if (i % 11 != 0) puts(""); if (i > 11) puts(""); j++;
    } puts("");
}
 
int  FWriteArr(__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH, FILE* & fArr, char * & Arr_txt)
{
    FILE * pArr = NULL; unsigned int i, j = 0;
 
    fopen_s(&pArr, Arr_txt, "wt+");
    if (pArr == NULL) { perror("Ошибка файла"); system("pause"); /*exit(1);*/ }
    else { fArr = pArr;
    
        while (j < SizeH) { i = 0;
            while (i < SizeW) { fprintf(fArr, "%6d ", Arr[j * SizeW + i]); i++; } 
            fprintf(fArr, "\n"); j++;
        }
    }
    fclose(pArr);
 
    if (pArr) { return 0; } else { return 1; }
}
 
int  FReadArr (__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH, FILE* & fArr, char * & Arr_txt)
{
    FILE *pArr = NULL; struct _stat64 fArrBuf; __int16 *ArrTmp = NULL, *ArrNew = NULL;
    char *Err1, Str1[23] = "\0", k = 0, Flag = -1; SizeW = 0; SizeH = 0;
    unsigned int i = 0, j = 0, CurChar = 0, OldW = 0;
 
    fopen_s(&fArr, Arr_txt, "ab+");
    if (fArr == NULL) { perror("Ошибка файла: #0"); system("pause"); }
    else { _fstat64(_fileno(fArr), &fArrBuf); 
        if (fArrBuf.st_size == 0) { perror("Ошибка файла: #1"); system("pause"); }
        else { 
            SizeW = 1; SizeH = 1; _fseeki64(fArr, 0, 0);
            while (CurChar < 33) CurChar = getc(fArr); 
 
            puts("Чтение из файла: \n");
            do { if (Flag < 0) { ArrTmp = Arr;
                ArrNew = (__int16*)realloc(ArrTmp, SizeW * SizeH * sizeof(*ArrTmp)); 
                if (Flag == -2 && OldW && j) {
                    j = SizeH - 1; while (j > 0) {
                        memmove_s((__int16*)Arr[j * SizeW], OldW * sizeof(*Arr),  //куда и предел свободного места байт
                            /*      */(__int16*)Arr[j *  OldW], OldW * sizeof(*Arr)); //откуда и сколько байт
                        } 
                    }
                } j = SizeH - 1;
                if (ArrNew == NULL) {
                    free(ArrTmp); ArrTmp = NULL; perror("Ошибка памяти"); system("pause"); }
                else { Arr = ArrNew; 
 
                    while (CurChar > 32 && CurChar != EOF) { //анализ последовательности символов
                        Flag = 0; k = 0; memset(Str1, 0, 7);
                        do {
                            Str1[k] = CurChar;
                            CurChar = getc(fArr);
                        } while (++k < 23 && CurChar > 32 && CurChar != EOF); Str1[k] = 0;
 
                        Arr[j * SizeW + i] = (short)strtol(Str1, &Err1, 10);
                        if (Str1 == Err1) {
                            Arr[j * SizeW + i] = 127 - rand() % 256;
                            printf("%6d~", Arr[j * SizeW + i]);
                        }
                        else printf("%6d ", Arr[j * SizeW + i]);
                    } //end while (CurChar > 32 && CurChar != EOF)
 
                    while (CurChar < 33 && CurChar != EOF) { //анализ изменения размеров массива Arr
 
                        if (CurChar != 13 && CurChar != 10 && CurChar < 33 && CurChar != EOF) {
                            if (Flag == 0) Flag = 1;
                            while (CurChar != 13 && CurChar != 10 && CurChar < 33 && CurChar != EOF)
                                CurChar = getc(fArr);
                        }
                        if ((CurChar == 13 || CurChar == 10) && (CurChar < 33 && CurChar != EOF)) {
                            Flag = 2; i = 0; while (CurChar == 13 || CurChar == 10) CurChar = getc(fArr);
                        }
                        if (Flag == 1 && CurChar > 32 && CurChar != EOF) { ++i; Flag = 0;
                            if (i % 11 == 0 && i > 0) puts(""); } //форматирование
                        else if (Flag == 2 && CurChar > 32 && CurChar != EOF) { ++SizeH; ++j; Flag = -1;
                            if (SizeW > 11) puts(""); } //дополнительный отступ
                        if (i >= SizeW) { OldW = SizeW; SizeW = i; ++SizeW; Flag = -2; }
                        if (Flag == 2 && i == 0) puts(""); //конец строки
 
                    } //end while (CurChar < 33 && CurChar != EOF)
                } //end else for if (ArrNew == NULL)
            } while (CurChar != EOF); puts(""); fclose(fArr); 
        } //end else for if (fArrBuf.st_size)
    } //end else for if (fArr == NULL)
 
    if (pArr && fArrBuf.st_size) { return 0; } else { return 1; }
}
 
int  MaxInStr (__int16 * & Arr,  unsigned int & SizeW, unsigned int & SizeH, __int16 * & ArrX)
{
    __int16 *ArrTmp = NULL, *ArrNew = NULL; unsigned int i = 0, j = 0;
 
    ArrNew = (__int16*)realloc(ArrTmp, SizeH * sizeof(*ArrTmp));
    if (ArrNew == NULL) { 
        free(ArrTmp); ArrTmp = NULL; perror("Ошибка памяти"); system("pause"); /*exit(1);*/ }
    else { ArrX = ArrNew;
 
        while (j < SizeH) { i = 0; __int16 Max = numeric_limits<__int16>::min();
            while (i < SizeW) {
                if (Arr[j * SizeW + i] > Max) { ArrX[j] = Arr[j * SizeW + i]; Max = ArrX[j]; } i++;
            } j++;
        }
    }
 
    if (ArrX) { return 0; } else { return 1; }
}
 
int  FWrtArrX (__int16 * & ArrX, unsigned int & SizeH, FILE* & fArrX, char* & ArrX_bin)
{
    struct _stat64 fArrBuf; 
 
    fopen_s(&fArrX, ArrX_bin, "wb+"); 
    fwrite(ArrX, sizeof(*ArrX), SizeH, fArrX); 
    _fstat64(_fileno(fArrX), &fArrBuf); 
    fclose(fArrX); 
 
    return fArrBuf.st_size < sizeof(ArrX) ? 1 : 0;
}
 
int  FReadArrX(__int16 * & ArrX, unsigned int & SizeH, FILE* & fArrX, char* & ArrX_bin)
{
    struct _stat64 fArrBuf; char c = '-';
    
    fopen_s(&fArrX, ArrX_bin, "ab");
    _fseeki64(fArrX, 0, 0);
    _fstat64(_fileno(fArrX), &fArrBuf);
 
    if (fArrBuf.st_size == 0) {
        perror("Ошибка файла: #2"); puts("Чтение отменено."); system("pause"); 
    }
    else if (fArrBuf.st_size < sizeof(ArrX)) {
        perror("Ошибка файла: #3"); fclose(fArrX);
        puts("Считать файл? [ + / - ]"); c = _getch();
    }
    if (c == '+') { fopen_s(&fArrX, ArrX_bin, "rb");
        fread(ArrX, sizeof(*ArrX), SizeH, fArrX);
    } fclose(fArrX);
 
    return fArrBuf.st_size == 0 ? 2 : fArrBuf.st_size < sizeof(ArrX) ? 3 : 0;
}
 
void PrintArrX(__int16 * & ArrX, unsigned int & SizeH)
{
    unsigned int j = 0; puts("Максимальные значения в строках массива: ");
 
    while (j < SizeH) { 
        printf("%6d ", ArrX[j]); if ((j + 1) % 11 == 0) puts(""); j++; } 
    puts(""); if (j > 11) puts("");
}
 
void SearchMin(__int16 * & ArrX, unsigned int & SizeH, __int16 & Min)
{
    unsigned int i = 0, j = 0;
 
    while (j < SizeH) { if (ArrX[j] > 0 && ArrX[j] <= Min) { Min = ArrX[j]; i++; } j++; }
 
    printf("Минимальное положительное значение массива ArrX: "); 
    if (i) { printf("%d \n", Min); } else puts("NaN");
}


И ещё нужна помощь в переделывании последней функции void SearchMin(__int16 * & ArrX, unsigned int & SizeH, __int16 & Min) на рекурсию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru