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

const char *[] в функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Узнать, все ли числа в массиве одинаковые http://www.cyberforum.ru/cpp-beginners/thread755347.html
Обработать массив из целых чисел А (не больше 100 эл-тов), вначале предусматривая заполнение массива числами. Узнать, все ли числа в массиве одинаковые.
C++ Бинарные деревья. Проверить на соответствие значения узлов дерева членам арифметической прогрессии Как проверить на соответствие значения узлов дерева членам арифметической прогрессии. Я так понимаю, что в порядке инфиксного обхода мне необходимо просчитывать разницу между соседними элементами, и если она одинакова везде, стало быть соответсвует арифм.прогрессии. Как просчитать эту разницу? подскажите пожалуйста... http://www.cyberforum.ru/cpp-beginners/thread755322.html
Сколько процентов от цифр в числе больше 5-и C++
Дано натуральное число n. Сколько процентов от чисел в этом числе больше, чем 5? Пример: n=2012, ответ = 0% n=199, ответ = 67%
график зависимостей количества перестановок от размерности массива C++
построить график зависимостей количества перестановок от размерности массива. Компилятор CodeBlocks. Нужны какие-нибудь идеи.
C++ Чтение текстового файла в вектор типа char http://www.cyberforum.ru/cpp-beginners/thread755291.html
Имеется текстовый файл. Необходимо прочитать его ПОЛНОСТЬЮ, включая все символы переноса строки (и 0A и 0D), все пробелы, нулевые символы (00), и т.д. в массив vector <char>. Я много способов пробовал, ближе всех был этот: #include <iostream> #include <fstream> #include <stdio.h> #include <string> #include <vector> using namespace std;
C++ Задача с Olympiads Вроде работает, но на половине тестов срезается... Условие: В столице одной небольшой страны очень сложная ситуация. Многокилометровые пробки буквально парализовали движение в городе, и власти на многих улицах ввели одностороннее движение, не анализируя, можно ли будет теперь проехать из любого места в городе в любое другое, не нарушая правила. Транспортная система столицы представляет собой N... подробнее

Показать сообщение отдельно
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2013, 02:39     const char *[] в функции
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//вот поиграйте с таким кодом. после идут пояснения.
 
#include <iostream>
#include <typeinfo>
 
typedef const char* CCharPtr;
 
void foo1(const char** arr)
{
    std::cout << "1 " << typeid(arr).name() << std::endl;
}
 
void foo2(const char* arr[])
{
    std::cout << "2 " << typeid(arr).name() << std::endl;
}
 
void foo3(CCharPtr* arr)
{
    std::cout << "3 " << typeid(arr).name() << std::endl;
}
 
void foo4(const CCharPtr* arr)
{
    std::cout << "4 " << typeid(arr).name() << std::endl;
}
 
void modify1(CCharPtr* arr, int index)
{
    arr[index] = 0;
}
 
void modify2(const CCharPtr* arr, int index)
{
    //arr[index] = 0;
}
 
 
int main()
{
    const char* arr[5] = {"aa", "adf", "dfdf", "adfdf", "sdfd"};
    
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
 
    modify1(arr, 0);
    std::cout << (void*)arr[0] << std::endl;
 
    modify2(arr, 0);
 
    return 0;
}
 
// void foo1(const char** arr);
// void foo2(const char* arr[]);
// это функции с одинаковыми сигнатурами. если их имена сделать одинаковыми,
// то компилятор начнет ругатся на то, что функция определена более одного раза. 
// мне привычнее иметь дело с const char** arr, а не с const char* arr[].
// далее нужно определить что такое const char**.
// смотрим на функцию вывод функции foo3. совпадает с foo1 и foo2.
// значит const char** - это указатель1 на указатель2, где указатель 2 указывает на константу.
// это значит, что указатель2 изменить можно. например сначало он указывал на строку "aa", но в
// в функции его поменяли так, что он теперь указывает в ноль, чего мы пытаемся измежать
// (см. вызов функции modify1 и что выводится после). теперь, если мы раскомментируем код в
// modify2, то получим ошибку о том, что у нас попытка изменить что-то константное. т.е. то, что
// нам нужно. итого правильный тип аргумента: const CCharPtr* arr, который совпадает с аргументом 
// void foo4(const CCharPtr* arr), которая в свою очередь выводит
// char const* const * что эквивалентно const char* const *.
// ИТОГО: нужно использовать одно из двух:
// char const* const *
// const char* const *
ну и в заключение:
такие массивы - это сишная жопа. если нет требований именно си, то лучше использовать с++. это std::vector, std::array или что-нибудь самодельное

и еще. не все компиляторы выдают человеческие имена типов. вот тут например:
http://liveworkspace.org/code/2yfRfI$7
но если сделать кое-какие ошибки, то в выводе компилятора появляются сигнатуры с нужными нам именами типов.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru