Указатель на массив
|
|
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 |
|
| |