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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
#1

В С++ может ли argv быть двухмерным массивом? - C++

09.05.2013, 17:23. Просмотров 1329. Ответов 40
Метки нет (Все метки)

C++
1
2
3
int main(int argc, char *argv[]) {
    argv[1][0] = tolower(argv[1][0]);
    argv[1][1] = tolower(argv[1][1]);
Вот что это означает?
Когда у argv с двумя аргументами?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 17:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В С++ может ли argv быть двухмерным массивом? (C++):

Управление двухмерным массивом из функции - C++
Доброго времени суток, пожалуйста, подскажите, как правильно передать в функцию указатель на двухмерный массив, а затем из функции изменять...

Работа с двухмерным динамеческим массивом через указатель - C++
Натупил здесь наверное сильно, подскажите ребят, а то долго уже сиджу над этим... Где ошибки? Программу компилирует, но потом выбивает. ...

Что есть argc и **argv в функции int main(int argc, char **argv)? - C++
Здраствуйте, уважаемые кодеры! Что означает argc и **argv в функции int main(int argc, char **argv), ни как не могу понять эти переменные...

Может ли быть такое? - C++
поставил счетчик для сравнений в пирамидальной сортировке массива выдает 34732 сравнения. Добавлено через 1 час 3 минуты up!

где может быть ошибка на с++ - C++
при подсчете sn через 5 членов цикл повторяется вот текст программы #include <iostream> #include <iomanip> #include <math.h> ...

В чём может быть ошибка? - C++
Не пойму в чём ошибка в программе: #include <iostream> using namespace std; int main( ) // Program that...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
13.05.2013, 23:06 #31
IGPIGP, я не уловил вашу мысль. С моей точки зрения: строковый литерал - это массив элементов (символов), а имя массива неявно преобразуется в указатель на первый элемент. Возможно есть особые правила на этот счёт, что бы можно было писать char const* str = "...", я не знаю. Но char, wchar_t и пр. сами по себе к этому отношения не имеют.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.05.2013, 23:28 #32
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель str на константный строковый литерал. От других указателей ничем не отличается - такой же указатель! Вся "супер-функциональность" это лишь разнообразные перегрузки.
Да всё это просто. Можно объяснить, что компилятор себя ведёт иначе когда строковый литерал видит, можно особенностью перегрузки... Но особенность типа и состоит в том, что он особенный и это тоже просто.
Цитата Сообщение от gray_fox Посмотреть сообщение
С моей точки зрения: строковый литерал - это массив элементов (символов), а имя массива неявно преобразуется в указатель на первый элемент.
С моей - нет. Вот массив символов:
char* chArr = new char[3];
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='c';
Этот указатель можно передать в функцию с длиной n=3 и это стиль работы с обычным массивом любого типа.
А такой массив - С-строка:
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='\0';
и это:
C++
1
const char *chArr="ab";//тут сам язык всё делает
и передавать его можно без размера и печатать cout << chArr;
и эта возможность сбивает с толку новичков. Особенно когда только начинают знакомиться с указателями, массивами и ссылками. Невдомёк им почему когда в функцию передаётся int* a без размера (дополнительного целого) и нет глобального его объявления, то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому. То есть может быть и строка, чего с другими типами быть не может. Тема именно об этом.
0
Croessmah
Эксперт CЭксперт С++
13225 / 7497 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 00:14 #33
Цитата Сообщение от IGPIGP Посмотреть сообщение
и передавать его можно без размера и печатать cout << chArr;
Это лишь соглашение, ставшее стандартом
Можете выдвинуть свое соглашение для массивов других типов, может приживется
Цитата Сообщение от IGPIGP Посмотреть сообщение
А такой массив - С-строка:
C-строка - это такой же массив чисел. Просто принято, что нулевой элемент считается последним в текущей последовательности. Во-первых, обеспечивает некоторую гибкость, во-вторых лучше задействовать один байт памяти для нуля, чем несколько для хранения длины строки, так же сравнение с нулем быстрее и т.д.

Цитата Сообщение от IGPIGP Посмотреть сообщение
почему когда в функцию передаётся int* a без размера (дополнительного целого) и нет глобального его объявления, то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому.
По-моему, Си-строки описываются в любом учебнике и если читать нормально, а не через страницу, то обязательно на это наткнешься в первых же главах.
то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому.
С чего вдруг? Если принимаем указатель на целое, то это может быть как указатель на одиночное значение, так и указатель на начало блока памяти где лежит куча таких целых

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
А такой массив - С-строка:
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='\0';
не равно этому:
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
const char *chArr="ab"; //тут сам язык всё делает
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
14.05.2013, 00:27 #34
Цитата Сообщение от Croessmah Посмотреть сообщение
Можете выдвинуть свое соглашение для массивов других типов, может приживется
Спасибо за приглашение. Для этого придётся переписать все библиотеки. Тип это и есть стандарт и это просто. Также просто как и то, что только с-строка из встроенных типов знает свой размер. Немного освобожусь и найду цитату где её величают "почти контейнером".
У Б.Страуструпа есть пример где он показывает, что первым шагом от массива к вектору могло бы быть резервирование нулевого индекса для хранения размера. То есть просто по большому счету. Просто один, - массив, а другой, - уже нечто большее.
Цитата Сообщение от Croessmah Посмотреть сообщение
не равно этому:
я это и имел в виду. Прочтите пост.
0
Croessmah
Эксперт CЭксперт С++
13225 / 7497 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 00:38 #35
Цитата Сообщение от IGPIGP Посмотреть сообщение
с-строка из встроенных типов знает свой размер.
ничего она не знает, просто функции ищут ноль и всё, так же как Вы ищите дом с определенным номером на улице, и там где Вы его нашли - не факт, что это конец улицы.
У Вас лишь соглашение, что дом с номером ноль является конечным пунктом Вашего похода
C++
1
char * str="abc\0def";
Размер строки далеко не 3, хотя для стандартных функций именно 3+нулевой символ
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
14.05.2013, 00:45 #36
Цитата Сообщение от Croessmah Посмотреть сообщение
ничего она не знает, просто функции ищут ноль и всё
У массива int не ищут. Croessmah, я понял ход Ваших рассуждений и думаю, доказать ничего не смогу. Ваши аргументы меня тоже не убеждают. Я буду говорить: массив char это массив, с-строка это с-строка. Вы будете говорить что с-строка это массив, только просто чуть-чуть "не такой". А дело же в чуть-чуть и есть.
Цитата Сообщение от Croessmah Посмотреть сообщение
Размер строки далеко не 4, хотя для стандартных функций именно 4
Угу, для функции main в частности. О которой поначалу и шла речь.
0
Croessmah
Эксперт CЭксперт С++
13225 / 7497 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 00:51 #37
Цитата Сообщение от IGPIGP Посмотреть сообщение
У массива int не ищут.
А как Вы себе это представляете? Можно, конечно же, зарезервировать какое-то определенное число для обозначения конца массива, но числа такая вещь, которое может равняться чему угодно и если у меня в результате вычислений один из элементов массива получится равным этому самому "концу", то это будет не конец массива, а конец программе
Ну и да, нам друг друга не понять, ибо:
Вы будете говорить что с-строка это массив, только просто чуть-чуть "не такой".
Абсолютно одинаковый - вот ход моих мыслей!
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
14.05.2013, 01:05 #38
Цитата Сообщение от Croessmah Посмотреть сообщение
Абсолютно одинаковый - вот ход моих мыслей!
Тогда скажите может ли компилятор самостоятельно различить массивы:
{'a', 'b', 'c'};
и
{'a', 'b', 'c','\0'};
без риска UB?
Для массивов:
{1,2,3,4}
такая задача не стоит. Никто в здравом уме не передаст int* , если размер как-то не оговорен. Такое возможно только с типом char*.
Спасибо, за дискуссию.
0
Croessmah
Эксперт CЭксперт С++
13225 / 7497 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 06:06 #39
Цитата Сообщение от IGPIGP Посмотреть сообщение
если размер как-то не оговорен.
Вот оно - оговореннуй нуль-терминатор!

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тогда скажите может ли компилятор самостоятельно различить массивы:
А это задача не компилятора

Добавлено через 58 секунд
Цитата Сообщение от IGPIGP Посмотреть сообщение
Такое возможно только с типом char*.
Такое возможно с любым типом, по договоренности
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2013, 06:31 #40
Цитата Сообщение от Князь Трех Море Посмотреть сообщение
Вот что это означает?
Когда у argv с двумя аргументами?
argv не может иметь других размерностей, он всегда плоский: argv - массив строк, а строка - массив символов.

Добавлено через 6 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Не в ассемблере, а по соглашению, поддерживаемому функциями ввода-вывода. C можно оттранслировать на язык ассемблера, при этом терминальным останется 0.

Добавлено через 4 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.


Да хоть, чем бы ни завершался. Скрытым он является при интерпретации и инициализации. А желание понять, оно или есть или его нет. Обращайтесь в первом лице, в обморок не упаду.
Добавлено через 3 минутыединственное отличие в инициализации явно-константным массивом.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 09:13 #41
Цитата Сообщение от taras atavin Посмотреть сообщение
Не в ассемблере, а по соглашению, поддерживаемому функциями ввода-вывода.
Да, я ж подчеркнул, что в ДОСе. Просто кроме как в ассемблере я больше нигде не видел применение символа '$' в качестве терминатора.

Цитата Сообщение от taras atavin Посмотреть сообщение
C можно оттранслировать на язык ассемблера, при этом терминальным останется 0.
Да, но если тот же printf() будет реализован через int 21h, то при выводе будет много мусора, потому что функция вывода будет ожидать '$', который не дождется. Поэтому я думаю под ДОСом функции вывода реализованы через BIOS, который ни о каких завершающих символах не знает, поэтому ему вместе со строкой передается еще и ее длина. Т.е. внутри printf() вызывается strlen() для организации корректного вывода.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 09:13
Привет! Вот еще темы с ответами:

В чём может быть ошибка? - C++
Пишет, что нету точки с запятой. Где??? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; { class Program ...

Память не может быть прочитала - C++
Здравствуйте, вот есть код: struct Dyn{ Syt select; Dyn* next; }; ............

Память не может быть прочитана! - C++
Проблема возникает при копировании одного массива в другой. Я вроди просмотрел и размерности вроди совпадают, но может быть я что то...

Где может быть ошибка? - C++
#include &lt;iostream&gt; #include &lt;queue&gt; #include &lt;string&gt; using namespace std; int main(){ string s; queue&lt;string&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.05.2013, 09:13
Ответ Создать тему
Опции темы

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