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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Morg4n
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 5
#1

Передача Указателя На Двумерный Массив В Функцию - C++

10.04.2013, 08:21. Просмотров 421. Ответов 6
Метки нет (Все метки)

Как изменить код, чтобы массив объявлялся в main() и передавался в input_strings().
Код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define MAXLENGTH 129
#define MAXSIZE 20
 
char arr_str[MAXSIZE][MAXLENGTH];
 
int input_strings(){
    int i,n;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) {
 
    int n;
    n = input_strings();
}
Голову уже сломал =\
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6187 / 5790 / 1875
Регистрация: 18.12.2011
Сообщений: 14,792
Завершенные тесты: 1
10.04.2013, 08:55     Передача Указателя На Двумерный Массив В Функцию #2
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
int input_strings(char** arr_str)
{
    int i,n;
    for(i = 0;i<MAXSIZE;i++)
    {
        printf ("line %-2d: ", i);
        if(gets(arr_str[i]))break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) 
{
   char** ps=new char*[MAXSIZE];
    for(int i = 0;i<MAXSIZE;i++)
             ps[i]=new char[MAXLENGTH];
 
    int n;
    n = input_strings(ps);
    ....
    for(int i = 0;i<MAXSIZE;i++)
        delete[] ps[i];
    delete[] ps;
}
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
10.04.2013, 08:56     Передача Указателя На Двумерный Массив В Функцию #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
 
#define MAXLENGTH 129
#define MAXSIZE 20
 
int input_strings(char arr_str[MAXSIZE][MAXLENGTH]){
    int i,n = 0;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }
    return n;
}
 
int main(void) {
    char arr_str[MAXSIZE][MAXLENGTH];
    int n = input_strings(arr_str);
 
    return 0;
}
dstat
36 / 38 / 1
Регистрация: 01.06.2011
Сообщений: 238
10.04.2013, 09:02     Передача Указателя На Двумерный Массив В Функцию #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#define MAXLENGTH 129
#define MAXSIZE 20
 
 
 
int input_strings(char arr_str[][MAXLENGTH]){
    int i=0,n=0;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) {
 char arr_str[MAXSIZE][MAXLENGTH];
    int n=0;
    n = input_strings(arr_str);
}
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
10.04.2013, 09:08     Передача Указателя На Двумерный Массив В Функцию #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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int inputStrings(char **arrayOfStrings, int maxHeight, int maxWidth) {
  int i;
  for (i = 0; i < maxHeight; ++i) {
    printf("line %-2d: ", i);
    // Резервируется 2 символа -- 1 под перенос строки, 1 под '\0'
    fgets(arrayOfStrings[i], maxWidth - 2, stdin);
    if (!arrayOfStrings[i] || arrayOfStrings[i][0] == '\n') {
      break;
    }
    // удаление переноса строки
    arrayOfStrings[i][strlen(arrayOfStrings[i]) - 1] = '\0';
  }
  return i;
}
 
char **createArrayOfStrings(int maxHeight, int maxWidth) {
  char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight);
  int i;
  for (i = 0; i < maxHeight; ++i) {
    arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth);
  }
  return arrayOfStrings;
}
 
void freeArrayOfStrings(char **arrayOfStrings, int maxHeight,
  int maxWidth) {
  int i;
  for (i = 0; i < maxHeight; ++i) {
    free(arrayOfStrings[i]);
  }
  free(arrayOfStrings);
}
 
int main(int argc, char *argv[]) {
  int maxHeight = 20;
  int maxLength = 129;
  
  char **arrayOfStrings = createArrayOfStrings(maxHeight, maxLength);
  
  int actualNumberOfLines = inputStrings(arrayOfStrings, maxHeight,
    maxLength);
  printf("Number of lines: %d\n", actualNumberOfLines);
  
  int i;
  for(i = 0; i < actualNumberOfLines; ++i) {
    printf("Line #%-2d: '%s'.\n", i, arrayOfStrings[i]);
  }
 
  freeArrayOfStrings(arrayOfStrings, maxHeight, maxLength);
  return 0;
};
Morg4n
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 5
10.04.2013, 09:28  [ТС]     Передача Указателя На Двумерный Массив В Функцию #6
dstat, anmartex, wow, 4 мать его часа гугления, чтобы все оказалось так просто - я полный кретин, спасибо!

lemegeton, если я правильно понял, Ваш вариант работает через массив указателей, такой подход, в моем случае вызовет слишком много лишних вопросов про то, как это конкретно работает, а я, к сожалению, не сильно пока разбираюсь в этом, но спасибо!
Помогите слегка разобраться:
C
1
2
3
 char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight); // я слегка сконфужен в этой строчке
 
arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth); // и в этой тоже =\
zss, аналогично и Ваш вариант, спасибо!
Правильно ли я понимаю:
C
1
2
3
char** ps=new char*[MAXSIZE]; // создаем "указатель массив" на массив указателей 
    for(int i = 0;i<MAXSIZE;i++)
             ps[i]=new char[MAXLENGTH]; // забиваем массив словами
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2013, 10:00     Передача Указателя На Двумерный Массив В Функцию
Еще ссылки по теме:

C++ Передача указателя в функцию
Передача указателя на функцию C++
C++ Передача указателя на двумерный массив в функцию
C++ Передача указателя на шаблонную функцию в другую функцию
C++ Передача указателя на массив структур в функцию

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

Или воспользуйтесь поиском по форуму:
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
10.04.2013, 10:00     Передача Указателя На Двумерный Массив В Функцию #7
Цитата Сообщение от Morg4n Посмотреть сообщение
char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight);
Тут происходит три вещи.
1. Объявляется переменная arrayOfStrings -- "указатель на указатель на символ", можно считать его массивом указателей на символ или массивом строк.
2. Выделяется память под maxHeight указателей на строки. То есть, под maxHeight строк.
3. Присваивается указателю из п.1 адрес на свежевыделенную память.
Грубо говоря, выделяется память под сам массив строк.

Цитата Сообщение от Morg4n Посмотреть сообщение
arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth);
Тут каждому указателю на символ внутри массива указателей (читайте предыдущий пункт) выделяется память размером maxWidth байт. Грубо говоря, выделяется память под конкретные строки.
Yandex
Объявления
10.04.2013, 10:00     Передача Указателя На Двумерный Массив В Функцию
Ответ Создать тему
Опции темы

Текущее время: 12:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru