Суббота, 04 Февраля 2023, 17:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Программирование » C/C++ » Указатель на массив (Help)
Указатель на массив
XakepДата: Понедельник, 22 Сентября 2014, 00:07 | Сообщение # 21
めちゃくちゃちゃ
Сейчас нет на сайте
а что именно тут тебе нужно? Если заполнить полностью массив, то наверное так:
Код

for(int i = 0; i<countString; i++)
      for(int k = 0; k<length; k++) {
        *(*(mas+i)+k) = getchar();
      }

      // Test
      for(int i = 0; i<countString; i++)
      for(int k = 0; k<length; k++) {
        putchar(*(*(mas+i)+k));
      }
JSentДата: Понедельник, 22 Сентября 2014, 00:13 | Сообщение # 22
постоянный участник
Сейчас нет на сайте
Да, нужно заполнить массив. Сделал так же, но теперь новый косяк. Задаю массив 2 на 2 и ввожу asdf. Тест выводит только asd.

Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
LightsoftДата: Понедельник, 22 Сентября 2014, 00:17 | Сообщение # 23
частый гость
Сейчас нет на сайте
можно было упростить цикл по той причине, что вы не используете в его теле k:

Код

for( int k = 0; k < length; k++ )
   *(*(mas+i)) = getchar();


Код

for( int k = length; k--; )
{
   *(*(mas+i)) = getchar();
}


Сообщение отредактировал Lightsoft - Понедельник, 22 Сентября 2014, 00:18
OpenGOOДата: Понедельник, 22 Сентября 2014, 00:18 | Сообщение # 24
почти ветеран
Сейчас нет на сайте
Снова ты не правильно написал
Цитата JSent ()
*(*(mas+i)) = getchar();

Надо так
Цитата Xakep ()
*(*(mas+i)+k) = getchar();


Если простой способ создать двухмерный массив

например так:
auto mas = new int[2][3];
или
int(*mas)[3] = new int[2][3];

удалять как обычный: delete[] mas;


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]


Сообщение отредактировал OpenGOO - Понедельник, 22 Сентября 2014, 00:31
JSentДата: Понедельник, 22 Сентября 2014, 00:20 | Сообщение # 25
постоянный участник
Сейчас нет на сайте
На самом деле использую *(*(mas+i)+k), мне же нужно адресовываться по двум "точкам" [i][k]. Просто опечатка была.

Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
LightsoftДата: Понедельник, 22 Сентября 2014, 00:28 | Сообщение # 26
частый гость
Сейчас нет на сайте
Не знаю, как у вас, но у меня все нормально работает и выводит.

Код
void _Main2()
{
   const size_t M = 2, N = 2;

   char** _array = new char*[ M ];

   for ( size_t i = 0; i < M; i++ )
   {
     *( _array + i ) = new char[ N ];
   }

   for ( size_t i = 0; i < M; i++ )
   {
     for ( size_t j = 0; j < N; j++ )
     {
       *( *( _array + i ) + j ) = std::getchar();
     }
   }

   for ( size_t i = 0; i < M; i++ )
   {
     for ( size_t j = 0; j < N; j++ )
     {
       std::cout << ( *( *( _array + i ) + j ) ) << " ";
     }
     std::cout << std::endl;
   }

   for ( size_t i = 0; i < M; i++ )
   {
     delete[] *( _array + i );
   }

   delete[] _array;
}
XakepДата: Понедельник, 22 Сентября 2014, 00:33 | Сообщение # 27
めちゃくちゃちゃ
Сейчас нет на сайте
у меня тоже норм выводит...
наверное ты после ввода жмешь Enter, а он тоже воспринимается как символ, поэтому в 2 раза меньше выводит.


Сообщение отредактировал Xakep - Понедельник, 22 Сентября 2014, 00:33
LightsoftДата: Понедельник, 22 Сентября 2014, 00:41 | Сообщение # 28
частый гость
Сейчас нет на сайте
OpenGOO, можно и так создавать массив, но я думаю, что без полного понимания того, как необходимо работать с указателями, не повредит и через цикл создавать первое время JSent'у.

Ну да, если после as нажать enter , то следующий символ в массиве будет '\n' а после них уже s, а f не попадет в массив вообще.


Сообщение отредактировал Lightsoft - Понедельник, 22 Сентября 2014, 00:50
OpenGOOДата: Понедельник, 22 Сентября 2014, 01:03 | Сообщение # 29
почти ветеран
Сейчас нет на сайте
Цитата Lightsoft ()
'\n'

Это два символа с кодом 10 и 13 Вот только не помню в каком порядке.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
XakepДата: Понедельник, 22 Сентября 2014, 01:14 | Сообщение # 30
めちゃくちゃちゃ
Сейчас нет на сайте
\n - это один символ, обычно для переноса используют два символа - \r\n

Добавлено (22.09.2014, 01:14)
---------------------------------------------
точнее в юникоде два символа.

JSentДата: Понедельник, 22 Сентября 2014, 13:04 | Сообщение # 31
постоянный участник
Сейчас нет на сайте
Получается, в первый символ массива записывается Enter, поэтому последний вводимый постоянно пропадает.



Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.

Сообщение отредактировал JSent - Понедельник, 22 Сентября 2014, 13:05
OpenGOOДата: Понедельник, 22 Сентября 2014, 13:58 | Сообщение # 32
почти ветеран
Сейчас нет на сайте
Код
for(int k = 0; k<length;) {
     char ch = getchar();
     if (ch != '\n') {
         *(*(mas+i)+k) = ch;
         ++k;
     }
}


Даже в таком простой программе надо делать проверку на корректность данных, вводимых пользователем.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
JSentДата: Понедельник, 22 Сентября 2014, 15:22 | Сообщение # 33
постоянный участник
Сейчас нет на сайте
Теперь работает правильно, хотя я и не понял почему функция getchar() считывает символ введённый до использования этой функции в коде.

Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
LightsoftДата: Понедельник, 22 Сентября 2014, 16:06 | Сообщение # 34
частый гость
Сейчас нет на сайте
JSent, когда вы нажимате ENTER, все данные отдаются вам кроме переноса строки, символ '\n' в буфере ввода остается. Он как раз остается после того, как вы использовали scanf

Сообщение отредактировал Lightsoft - Понедельник, 22 Сентября 2014, 16:09
JSentДата: Понедельник, 22 Сентября 2014, 16:49 | Сообщение # 35
постоянный участник
Сейчас нет на сайте
Можете подсказать, чем отличается void ff(char& ch) от void ff(char *ch) ?

Добавлено (22.09.2014, 16:49)
---------------------------------------------
Передать переменную в процедуру мне удаётся только первым способом, а массив только вторым. В чём различие?


Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.

Сообщение отредактировал JSent - Понедельник, 22 Сентября 2014, 16:41
-l33t-h4xx-Дата: Понедельник, 22 Сентября 2014, 16:54 | Сообщение # 36
участник
Сейчас нет на сайте
void ff(char& ch) - это передача ссылки, void ff(char *ch) - указателя.
Нужно почитать в книжке по С++ главу про ссылки, и всё станет ясно. В двух словах не объяснишь, главное - это весьма разные вещи.


Как правильно задавать вопросы
LightsoftДата: Понедельник, 22 Сентября 2014, 17:09 | Сообщение # 37
частый гость
Сейчас нет на сайте
Когда значение передается по ссылке, его можно менять в функции и оно изменится в переменной, которая передана в функцию.

Код
void ff( char &ch ) { ch++; }

char _ch = 'X';
ff( _ch ); // после в _ch будет 'Y'


Когда передаете как указатель, то значение можно тоже менять, но только через разыменование.

Код
void ff( char *ch ) { (*ch)++; }

char _ch = 'X';
ff( &_ch ); // после в _ch будет 'Y'


Вы можете передавать массив потому что массив - это указатель на кусок памяти в которой через каждые N байт находится значение.

Еще можно передавать массив и так:

Код
void ff( int arr[], size_t arraySize )


простой пример:

Код
int sumArray( int arr[], size_t size )
{
      int sum = 0;

      for ( size_t i = 0; i < size; i++ )
      {
        sum += arr[ i ];
      }
      return sum;
}

void _Main2()
{
    int x[ ] = { 1, 2, 3, 4, 5, 6, 7 };
    size_t size = sizeof( x ) / sizeof( x[ 0 ] );

    std::cout << "sum: " << sumArray( x, size ) << std::endl;
}


Сообщение отредактировал Lightsoft - Понедельник, 22 Сентября 2014, 17:20
Форум игроделов » Программирование » C/C++ » Указатель на массив (Help)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2023 Рейтинг