![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
народ помогите!
получается - Cannot convert 'char *' to 'char[]' --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
mclight, Где получается?
Компилер обычно строку называет Делай так:
|
|||
|
||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
19
Добавлено @ 22:54 19 --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| Ni@m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 11.3.2004 Где: почти Киев Репутация: 0 Всего: 6 |
А так не годится? --------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше. |
|||
|
||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
пытался
скорее всего это и есть правильное решение. видимо я структуру не правильно настроил. что-ж Большое спасибо! --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
mclight, в чем дело? А ведь я тебе где-то в старых темах написал ее решение. Что не подошло? По поводу строки 19: ты пытаешься присвоить один массив другому, а это в С++ сделать нельзя . Наверно надо ипользовать цикл (или memmove).
Кстати ты мешаешь в коде вызовы функций WinAPI с древними библиотечными функциями Борланда, как то странно получается... --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| Ni@m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 11.3.2004 Где: почти Киев Репутация: 0 Всего: 6 |
Цитата
ты пытаешься присвоить один массив другому Цитата Наверно надо ипользовать цикл Часто бывает, что функции возвращают указатель на выделенную память, не так как strcat, а как realloc. Обязательно надо высвободить память. Утечки сейчас никого не красят. Но мне непонятно, как в этом случае пройтись циклом?? А почему нельзя присвоить один массив дркгому?? попробуй это:
Прошу прощения - предыдущий пост был моим. Забыл зарегаться. Это сообщение отредактировал(а) Ni@m - 1.8.2005, 11:37 --------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше. |
|||
|
||||
| LPBOY |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
По правилам С++ этого делать нельзя. Придумал не я, все претензии к Страуструпу (Вообще я говорю о массиве как о типе.) В твоем коде ты присваиваешь указателю b (а не массиву) адрес 3-го элемента массива a. Никакого присваивания одного массива другому тут нет. Массив и указатель это разные вещи. У mclight'а был один массив внутри структуры dirent, который объявлен след. образом (в dirent.h):
Затем он создал второй char dirname[] и попытался скопировать в него массив d_name. Самый естесственный способ сделать это с помощью цикла. Хотя вместо
проще было бы написать сразу
промежуточные массивы тут даже не нужны...
А в чем проблема? --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||||||
|
|||||||||||
| RTcoder |
|
|||
|
Unregistered |
можно и так если использовать только приметивы с:
конечно лучше не мешать приметивы разных в концептуальном плане библиотек - а то программа может получиться больших размеров - оптимально использовать либо приметивы самого языка(string.h, cstring....), либо функции и методы свойственные для конкретной реализации библиотеки (MFC, VCL), или же приметивы самой ОС (API) |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Согласен, но тут есть несколько моментов 1) Точнее будет так:
2) Этот частный случай работает только для массивов, содержащих asciiz-строки. 3) Внутри функции strcpy все равно крутится все тот же цикл P.S. использовать макрос TEXT для указателей нет никакого смысла TEXT(ent->d_name). Это приведет к ошибке компиляции если определен Юникод. Это сообщение отредактировал(а) LPBOY - 1.8.2005, 14:35 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
спасибо. а твой иходник LPBoy тогда не пошел.
Он выводил одну папку. и все. а мне надо было все. я не стал дальше разбираться. что-там к чему. времени не было. но все равно огромное спасибо! Это сообщение отредактировал(а) mclight - 3.8.2005, 01:56 --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| mclight |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
Народ конечно извините. я Вас совсем замучил. получилось все!
дело было не в промежеточных массивах. все что вы предлагали я и раньше делал. вот только программа выводила только первую папку. ане все.
исправил на
правда совсем не понял почему так получилось. прежде чем открыть след папку выводится сообщение об ошибке если написать
то перед каждом открытием новой папки будет выводиться слово "ошибка", затем название папки. конечно очень хочется узнать в чем тут проблема. Это сообщение отредактировал(а) mclight - 3.8.2005, 02:11 --------------------
Как я решал подводные камни Cakephp и не только |
||||||
|
|||||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
можешь объяснить что и где? --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Я не телепат
Это не ошибка, просто обычно придерживаются какого-то одного стиля. Функция is_dir написана средствами WinAPI (т.е. ориентирована на Windows), а в остальной программе используются функции библиотеки борланда (ориентированной на MS-DOS).
Не, мой исходник выводит ВСЕ папки и файлы. Не знаю почему у тебя выводит только одну... Может ты имя папки задавал больше 8-ми символов, с такими именами функции MS-DOS не работают. Попробуй с папкой с коротким именем или если имя длинное, например program files, то надо писать так progra~1. И слэш надо использовать не одинарный, а двойной. Например: c:\\dir --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
а именно строка 28 Это сообщение отредактировал(а) mclight - 3.8.2005, 03:38 --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
я это сделал чтобы переводить было легче. --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Выводится "ошибка", потому что ты сам это выводишь. Функция chdir возвращает 0 в случае успешного завершения, поэтому инструкция if(!chdir(ent->d_name)) printf("ошибка"); выводит строку "ошибка" при каждом успешном завершении chdir. Логичней написать if(chdir(ent->d_name)) printf("ошибка"); Программа работает, но в некоторых местах можно немного улучшить. 1) строку if(ent->d_name[0]=='.' && (ent->d_name[1]==0 || (ent->d_name[1]=='.' && ent->d_name[2]==0)))continue; можешь спокойно заменить на if(ent->d_name[0]=='.') continue; Дело в том что если первый символ точка, то это в любом случае или "."(текущая папка) или ".."(предыдущая) делать дополнительные проверки на ноль и вторую точку незачем. Имя обычной папки не может начинаться с точки. 2) while((ent=readdir(d))!=NULL) это то же самое, что while(ent=readdir(d)) 3) строку 16 int i,a; замени на int i; ;) --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
уй мля. у меня че-то совсем крыша поехала. вот что значит не спать по ночам. извините что потревожил Вас по пустякам.
3) ну это обычная опечатка. огромное Вам спасибо! Добавлено @ 05:21
выдает предупреждение. --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Какое предупреждение? --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| mclight |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 6.7.2005 Где: Baku, Azerbaijan Репутация: нет Всего: 2 |
не помню точно какое. я все же оставил прежний вариант. на всякий. вот а вообще спасибо. просто не было времени разбираться. код был скопирован с РНР. и соответственно при переводе на С++ были проблемы. а времени ужас как не было. так что огромное спасибо
! --------------------
Как я решал подводные камни Cakephp и не только |
|||
|
||||
| Ni@m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 11.3.2004 Где: почти Киев Репутация: 0 Всего: 6 |
Поработав в с/с++ начинаешь терять ориентацию между реальностью и указателями. В общем указателями реализовывается массив. Единственнон удобство статического массива - что за тебя освобождает память компилятор. Это безусловно удобно. Но принцип действия - как и у указателя. Ну и конечно не надо забывать, что массива как типа нету. Нету типа array и тут не попишешь. Это не паскаль. Ведь --------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Ni@m
Вообще говоря, тип массива есть. Но он сохраняется только в пределах видимости переменной. mclight На предупреждение можешь забить - в меру умный компилятор напоминает, что в условии можно сделать опечатку и написать "=" вместо "==". В данном случае все верно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Ничего подобного. Имеется стандартное преобразование имени массива в указатель на его первый элемент, но не надо путать массив и указатель - это совершенно разные типы.
Авторы Стандарта С++ считают по-другому: "8.3.4 In a declaration T D where D has the form D1 [constant-expression] and the type of the identifier in the declaration T D1 is "derived-declarator-type-list T", then the type of the identifier of D is an array type." Откомпилируй, например, такую программу:
Выдает false, кроме старых версий VC, у которых глюк по этому поводу. Это сообщение отредактировал(а) LPBOY - 4.8.2005, 11:49 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
И еще -- readdir возвращает указатель на отведенную внутри нее память. Ты должен ее освобождать в конце каждого оборота цикла.
Это сообщение отредактировал(а) comcon1 - 4.8.2005, 11:57 |
|||
|
||||
| Ni@m |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 11.3.2004 Где: почти Киев Репутация: 0 Всего: 6 |
Мне кажется на уровне процессорных инструкций - тоже Дело в том, что компилятору можно отследить его размеры и своевременно освободить занимаемую им память, тем самым он проще в использовании.
Попрошу разьеснить что значит в пределах видимости переменной в данном случае. Ведь с указателем таже ситуация. Или я уже запутался --------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Это значит, что вне области видимости (например, при передаче в качестве параметра функции) тип T[N] неотличим от T*. Но в ее пределах это разные типы и даже массивы разного размера - разные типы. Например, специализации шаблона типом int[5] и int[10] различаются. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |