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

Индексация двухмерного массива char - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
ivpoed
1 / 1 / 0
Регистрация: 21.03.2010
Сообщений: 38
26.03.2010, 23:49     Индексация двухмерного массива char #1
Подскажите пожалуйста, как правильно передать в функцию указатель на двухмерный массив char и как его индексировать?
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.03.2010, 00:37     Индексация двухмерного массива char #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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ROWS 5
#define MAX_STR 256
 
void printRows(char **arr, size_t rows){
    size_t i;
    for ( i = 0; i < rows; ++i )
        printf("%s\n", arr[i]);
}
 
int main(void){
    char buf[MAX_STR], *p, **arr;
    int i;
    
    if ( ( arr = (char**)malloc(sizeof(char*) * ROWS) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    printf("Enter %d strings:\n", ROWS);
    for( i = 0; i < ROWS; ++i ){
        if ( !fgets(buf, MAX_STR, stdin) ){
            fprintf(stderr, "Can't get row");
            exit(1);
        }
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( !*buf ){
            fprintf(stderr, "Empty rows not allowed!\n");
            exit(1);
        }
        if ( ( arr[i] = strdup(buf) ) == NULL ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
    }
    printf("You have entered:\n");
    printRows(arr, ROWS);
    
    for ( i = 0; i < ROWS; ++i )
        free(arr[i]);
    free(arr);
    
    exit(0);
}
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
27.03.2010, 00:47     Индексация двухмерного массива char #3
Хороший вопрос.
Есть 2 подхода.
1. (школярский)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#define N 20
#define M 35
fm(int A[N][M]....)
{
   for(i=0;i<n;i++)
     for(j=0; j<M j++) 
        if (A[i][j]==0) Oh!
}
main()
{
  int B[N][M];
  fm(B);
}
2й -изощренный
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int **CreateM(int n, int m)
{  int **a;
     a = (int **)malloc(n * sizeof(int *));
     for(i=0; i<n; i++)
       a[i] = (int *) malloc(m*sizeof(int));
     return a;
}
fm(int **x, n, m)
{
   for(i=0;i<n;i++)   // абсолютно тоже самое! 
     for(j=0; j<M j++) 
        if (A[i][j]==0) Oh!
}
main()
{
  int **B;
  B = CreateM(n, m);
  fm(B, n, m);
}
2-й подход значительно гибче. Размерность массива ты можешь определить по ходу счета,
часто она зависит от исходных данных
Кроме того, при некоторой модификации он дает возможность делать строки разной длины.
ivpoed
1 / 1 / 0
Регистрация: 21.03.2010
Сообщений: 38
27.03.2010, 08:54  [ТС]     Индексация двухмерного массива char #4
Спасибо большое. Я всё пытался с одним указателем. Не думал, что тут нужен указатель на указатель.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
27.03.2010, 14:01     Индексация двухмерного массива char #5
ivpoed, вообще-то можно и с одним указателем. Делаем сами некоторую работу за транслятор,
код чуть менее понятный, но покороче
C
1
2
int A[N*M];
 A[i*M+j] = ... // это то же, что и A[i][j] в предыдущих вариантах
Yandex
Объявления
27.03.2010, 14:01     Индексация двухмерного массива char
Ответ Создать тему
Опции темы

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