Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2015, 08:13   #11
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от Fixator Посмотреть сообщение
В коде, common_dir_path - это адрес буфера, в 257 байт( тип данных char),
256

Цитата:
Сообщение от Fixator Посмотреть сообщение
Мне надо в буфер common_dir_path, дописать параметр командной строки (имя файла), с использованием index'а, функцией strcpy. Как это сделать?
Возвращаясь к вопросу. Я вижу остались непонятки.
Код:
 strcpy(common_dir_path[index], src_file_name);
common_dir_path[index] - эквивалент этому на языке С будет *( common_dir_path + index ) - чтение БАЙТА по адресу (тип указателя как раз таки и подсказывает, сколько именно считывать по адресу).
1-ый параметр функции strcpy - принимает АДРЕС. Осуществляется адресация операнда по заданному значению в указателе. Компилятор вас оберегает от некорректного поведения вашей программы. Он не дает передать ЗНАЧЕНИЕ (которое явно не связано с логикой адресов) под АДРЕС. Ему нужна от вас гарантия того, что вы действительно осознаете, что скрывается под переменной именно АДРЕС (к этой переменной будет применен соотв. способ интерпретации - наверняка известная для вас, косвенная адресация). Код символа тоже можно интерпретировать как адрес (раз уж на то пошло) - но тогда вы должны об этом явно сообщить компилятору:
char* ( common_dir_path[index] )

В вашем же случае, как уже и написали выше, необходимо было применить адресную арифметику, результатом которой являлся бы по прежнему АДРЕС:
Цитата:
Сообщение от waleri Посмотреть сообщение
strcpy(common_dir_path + index, src_file_name);
Если такой вариант не устраивает - есть еще унарный оператор &, который возвращает адрес заданного аргумента:
&common_dir_path[index]

Цитата:
Сообщение от Fixator Посмотреть сообщение
.
Например, я ввел в командную строку: Project.c Temp
Покажите полную строку ввода в командном интерпретаторе.
С момента запуска исполняемого файла.

Цитата:
Сообщение от Fixator Посмотреть сообщение
.
2.Копирую 0-ой аргумент, в буфер.
3.Теперь, строка буфера, выглядит так: F:\Project\Project.c
Скорее:
Цитата:
F:\Project\Project.exe
По коду (уже исправленному, с учетом вышесказанных комментариев), у вас все должно работать. Конечно же еще учитывая логику работы strcpy - копируемая строка не должна спровоцировать выход указателя на исходную строку за ее пределы.
Там же обычное безразборчивое копирование вида:
Код:
*str1++ = *str2++
Приложите еще раз исходный код, только уже с учетом исправлений.

Последний раз редактировалось Базиля; 15.12.2015 в 08:19.
Базиля вне форума Ответить с цитированием
Старый 16.12.2015, 18:12   #12
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Что например будет, если в common_dir_path не будет символа \?
1.Я только начал писать программу. Ещё не всё, успел предусмотреть. И программа, ещё не закончена - всё только начинается. В С, разбираюсь очень плохо, поэтому процесс движется: очень, оочень и ооочень медленно. Всё время, встречаются "палки в колёсах".
2.В common_dir_path, записывается путь того места, откуда запущена программа. Соответственно, если нет диска, то и нельзя с него запустить программу. А в присутствующем диске, соответственно, путь будет.
Цитата:
Сообщение от waleri Посмотреть сообщение
И кстати, что это вы за ассемблерщик, если выходите за пределы массива?
1.Я нигде не писал, что я крутой Ассемблерщик.
2.Я пришёл сюда, обсуждать язык С, а не Ассемблер и свои навыки, в нем.
3.За пределы, кого массива? Ты, пределы определял? Директивой char - можно выделять массив любого размера(на сколько памяти хватит). Во всяком случае, в Ассемблере можно (например: my_array db 10000 dup (0) ; массив, размером в 10000 байт).
4. Массив я выделял, так: 255 байт и +1 байт, для 0 зарершителя строки. Я с размером массива под строку, ещё не определился окончательно - это только набросок.
5.Строка с путём к файлу очень маленькая, и в мой массив, помешается полность, и ещё очень много места, остаётся после строки.
6.Другое дело, что я ошибся, когда выделил память директивой char, вместо unsigned char(и это нормально, ведь я только учусь.).

Потому что, в Ассемблере, так:
db — резервирование памяти для данных размером 1 байт.
Директивой db можно задавать следующие значения:

выражение или константу, принимающую значение из диапазона:
для чисел со знаком –128...+127;
для чисел без знака 0...255;

Цитата:
Сообщение от waleri Посмотреть сообщение
Таких в наших краях называют одним словом - ламер.
Оскорблять человека, за стремление учиться? Фу... Как не красиво. Это низко, и недостойно профессионала, и уважения к вам.
Не судите строго. Я только учусь языку С.

Последний раз редактировалось Fixator; 16.12.2015 в 21:51.
Fixator вне форума Ответить с цитированием
Старый 16.12.2015, 18:19   #13
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
256
Да - тут, я ошибся. Бывает. Язык, с толку сбивает. Но как известно - "не ошибается тот, кто ничего не делает" и "на ошибках, учатся". А я, как раз таки, только учусь писать на языке С.
Цитата:
Сообщение от Базиля Посмотреть сообщение
Возвращаясь к вопросу. Я вижу остались непонятки.
Да, остались. Язык С, для меня - совсем другой мир, причём(не в обиду, а ради ясности), мир перевёрнутый, с ног, на голову, кривой, и очень безобразный. Поэтому, понять и привыкнуть к нему, лично мне - очень сложно. Язык С - королевтво кривых зеркал (для меня).
Цитата:
Сообщение от Базиля Посмотреть сообщение
Код:
 strcpy(common_dir_path[index], src_file_name);
common_dir_path[index] - эквивалент этому на языке С будет *( common_dir_path + index ) - чтение БАЙТА по адресу (тип указателя как раз таки и подсказывает, сколько именно считывать по адресу).
1-ый параметр функции strcpy - принимает АДРЕС. Осуществляется адресация операнда по заданному значению в указателе. Компилятор вас оберегает от некорректного поведения вашей программы. Он не дает передать ЗНАЧЕНИЕ (которое явно не связано с логикой адресов) под АДРЕС. Ему нужна от вас гарантия того, что вы действительно осознаете, что скрывается под переменной именно АДРЕС (к этой переменной будет применен соотв. способ интерпретации - наверняка известная для вас, косвенная адресация). Код символа тоже можно интерпретировать как адрес (раз уж на то пошло) - но тогда вы должны об этом явно сообщить компилятору:
char* ( common_dir_path[index] )

В вашем же случае, как уже и написали выше, необходимо было применить адресную арифметику, результатом которой являлся бы по прежнему АДРЕС:

Если такой вариант не устраивает - есть еще унарный оператор &, который возвращает адрес заданного аргумента:
&common_dir_path[index]


Покажите полную строку ввода в командном интерпретаторе.
С момента запуска исполняемого файла.

Скорее:

По коду (уже исправленному, с учетом вышесказанных комментариев), у вас все должно работать. Конечно же еще учитывая логику работы strcpy - копируемая строка не должна спровоцировать выход указателя на исходную строку за ее пределы.
Там же обычное безразборчивое копирование вида:
Код:
*str1++ = *str2++
Приложите еще раз исходный код, только уже с учетом исправлений.
Базиля
Большое спасибо, за разъяснения. Пока что, не всё понял, но буду разбираться. Почему? - написал, чуть выше.
Не судите строго. Я только учусь языку С.

Последний раз редактировалось Fixator; 16.12.2015 в 21:52.
Fixator вне форума Ответить с цитированием
Старый 16.12.2015, 22:14   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Fixator Посмотреть сообщение
Это низко, и недостойно профессионала, и уважения к вам.
Угум, сказав "Профессионалы блин" вы высказали все свое уважение...
waleri вне форума Ответить с цитированием
Старый 16.12.2015, 23:44   #15
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от Fixator Посмотреть сообщение
кривой, и очень безобразный.
А можно какой-нибудь конкретный пример безобразия (ну и кривизны вдогонку) ?

И между делом.
Соглашусь с waleri.
C вашей стороны, безусловный переход с "ты" на "вы" тоже подается контексту:
Цитата:
Сообщение от Fixator Посмотреть сообщение
Это низко, и недостойно профессионала, и уважения к вам.
Давайте просто побольше уважения и добра
Базиля вне форума Ответить с цитированием
Старый 17.12.2015, 01:46   #16
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Угум, сказав "Профессионалы блин" вы высказали все свое уважение...
А где там, лично к тебе, оскорбление? В своём сообщениии, я никого не оскорблял, а только лишь, выразил свои эмоции, а ты напрямую оскорбил. Если тебе, что-то показалось, то это, твои личные проблемы, и это не повод оскорблять незнакомого человека, особенно того, кто лично тебе, ничего полохого не сказал и не сделал.

Цитата:
Сообщение от Базиля Посмотреть сообщение
А можно какой-нибудь конкретный пример безобразия (ну и кривизны вдогонку) ?
Не скажу, а то поссоримся, а мне этого очень нехочется. Я в целом, мягко говоря, не перевариваю высоко-уровневые языки.
Цитата:
Сообщение от Базиля Посмотреть сообщение
И между делом.
Соглашусь с waleri.
Это ваше право.
Цитата:
Сообщение от Базиля Посмотреть сообщение
C вашей стороны, безусловный переход с "ты" на "вы" тоже подается контексту:
Согласен, и за это извиняюсь. Но я, никаких прямых оскорбительных надписей на его счёт, не делал, а он сделал. И после такого, я только на ты, и буду его называть, если вообще буду продолжать с ним общаться.
Цитата:
Сообщение от Базиля Посмотреть сообщение
Давайте просто побольше уважения и добра
Я, только за. Но к людям, которые меня оскорбляют, уважения и добра, никогда не будет.
Не судите строго. Я только учусь языку С.

Последний раз редактировалось Stilet; 17.12.2015 в 10:40.
Fixator вне форума Ответить с цитированием
Старый 22.12.2015, 04:18   #17
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Fixator Посмотреть сообщение
Пока что, не всё понял, но буду разбираться.
Всё. Разобрался.

Почитал книги. Посмотрел видео от Линды. Поправил код. Теперь, всё компилируется как надо, и работает замечательно.

Должен сказать - изучить Ассемблер, было в 1000000 раз легче. Тяжёлый язык, имхо.

Большое спасибо всем, кто помогал. Отдельное спасибо Базиля.

На этом, тема закрыта.
Не судите строго. Я только учусь языку С.

Последний раз редактировалось Fixator; 22.12.2015 в 04:22.
Fixator вне форума Ответить с цитированием
Старый 22.12.2015, 06:51   #18
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Ассемблер, было в 1000000 раз легче. Тяжёлый язык, имхо.
C тяжелый язык? Батюшки...
Давайте к нам, в C++, тут легко
Croessmah вне форума Ответить с цитированием
Старый 23.12.2015, 07:59   #19
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
C тяжелый язык? Батюшки...
По сравнению с Ассемблером, да.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Давайте к нам, в C++, тут легко
Ой нет! Боже упаси!
Не судите строго. Я только учусь языку С.

Последний раз редактировалось Fixator; 23.12.2015 в 08:17.
Fixator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык С. Как получить, размер аргумента командной строки? Fixator Общие вопросы C/C++ 26 15.12.2015 02:57
Скопировать таблицу в буфер agregator Microsoft Office Word 4 21.10.2012 16:42
Параметр в командной строке Nina+ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 30.05.2011 21:54
В командной строке вводится 1 параметр Snapper Помощь студентам 5 18.12.2010 09:39
Как скопировать текст в буфер обмена с одного edit-a и вставить в другой SeRhy Общие вопросы Delphi 2 26.07.2008 23:02