Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизКак в С++ правильно работать с функциями?! Найти похожие ветки
← →
Konstantin555 © (2006-09-06 00:05) [0]Пишу так:
#include <iostream>
#include <string>
using namespace std;
int main()
{
extern void swap(int*,int*);
void swap(int* p, int* q)
{
int t=*p;
*p=*q;
*q=t;
}
cout<<swap(1,4);
string name;
cout<<"Please enter you name:\n";
getline(cin,name);
cout<<"Hello, "<<name<<"!\n";
return 0;
}
В результате ошибки:
error C2601: "swap" : local function definitions are illegal
error C2664: "swap" : cannot convert parameter 1 from "const int" to "int *"
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
КАК ИСПРАВИТЬ?!
← →
DiamondShark © (2006-09-06 00:11) [1]
> КАК ИСПРАВИТЬ?!
Перенести за пределы main
Ну нету в Ц вложенных ф-ций. Нету.
(плохой язык)
← →
Cyrax © (2006-09-06 00:24) [2]А extern можешь убрать - он подразумевается по умолчанию...
Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...
DiamondShark © (06.09.06 00:11) [1]
(плохой язык)
Ты о русском или C++ ?
← →
guav © (2006-09-06 00:25) [3]> cout<<swap(1,4);
Это что ?
Литеральные константы не указатели (кроме 0).
И вообще не lvalue чтобы получать на их ссылку и менять их местами.
и swap возвращает void, что должно пойти на cout ?
> [1] DiamondShark © (06.09.06 00:11)
> (плохой язык)
ага...
← →
Cyrax © (2006-09-06 00:29) [4]Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...
...если етот implement красуется до main"a...
← →
Аноним2000 (2006-09-06 00:59) [5]2Konstantin555
вот ентот фрагмент
> extern void swap(int*,int*);
>
> void swap(int* p, int* q)
> {
> int t=*p;
> *p=*q;
> *q=t;
> }
>
> cout<<swap(1,4);
бред редкостный. просто удали его и все заработает
← →
Cyrax © (2006-09-06 01:19) [6]guav © (06.09.06 00:25) [3]
> cout<<swap(1,4);
Это что ?
Литеральные константы не указатели (кроме 0).
1. Не литерные константы, а целые константы...
2. 0 это никакой не указатель - см. п.1
И вообще не lvalue чтобы получать на их ссылку и менять их местами.
Не ссылку, а указатель (см. функцию)...
и swap возвращает void, что должно пойти на cout ?
Ничего. Выйдет ошибка...
>> (плохой язык)
> ага...
Всё-таки о русском...
← →
Джо © (2006-09-06 01:19) [7]> [6] Cyrax © (06.09.06 01:19)
> >> (плохой язык)
> > ага...
> Всё-таки о русском...
О говяжьем.
← →
guav © (2006-09-06 01:31) [8]
> [6] Cyrax © (06.09.06 01:19)
> 1. Не литерные константы, а целые константы...
Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.
http://msdn2.microsoft.com/en-us/library/c70dax92.aspx
> 2. 0 это никакой не указатель - см. п.1
0 это типа nil, пустой указатель. функция с таким объявлением может принять в качестве параметров (0, 0) (хотя данная функция и приведёт к AV при выполнении)
> Не ссылку, а указатель (см. функцию)...
ну да, ошибся... привык что это синонимы.
> Ничего. Выйдет ошибка...
так и я о том же.
> >> (плохой язык)
> > ага...
> Всё-таки о русском...
кто о чём, но я о С++, в часности о http://delphimaster.net/view/15-1157465777/
← →
vidiv © (2006-09-06 02:21) [9]Объясните, пожалуйста, смысл этой строки???
> cout<<"Please enter you name:\n";
А точнее символов <<
← →
Cyrax © (2006-09-06 09:12) [10]Всё, дальше идём в духе :)
guav © (06.09.06 01:31) [8]
>> 1. Не литерные константы, а целые константы...
>Литералы это и есть константы
Тогда получается тавтология:
литерная константа = литерный литерал (или константная константа)...
> Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.
Настораживает "The terms "literal" and "constant" are used interchangeably here"
В более строгом понимании константа может быть представлена, например, символьным или числовым литералом. В примере в конечном счёте используется анонимная константа...
0 это типа nil, пустой указатель
1. nil - это в pascal"е, а в C - null.
2. 0 имеет тип int. Но с помощью стандартных преобразований приводится к типу указателя.
кто о чём, но я о С++...
Сожалею... :)
...в часности о http://delphimaster.net/view/15-1157465777/
А что там такого, если не секрет ?
> vidiv © (06.09.06 02:21) [9]
> Объясните, пожалуйста, смысл этой строки???
>> cout<<"Please enter you name:\n";
>А точнее символов <<
Это оператор вывода в поток.
← →
Cyrax © (2006-09-06 11:55) [11]Хочу сделать вот такое замечание.
В паскале то, что называют указателем, является на самом деле (по реализации) не чем иным, как сцылкой...
← →
DiamondShark © (2006-09-06 12:06) [12]
> >А точнее символов <<
>
> Это оператор вывода в поток.
Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.
← →
DiamondShark © (2006-09-06 12:08) [13]
> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...
Всё с точностью до наоборот. УМЧ.
← →
evvcom © (2006-09-06 12:13) [14]> [11] Cyrax © (06.09.06 11:55)
> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...
А в чем разница? И пишется вообще-то так: "ссылка".
← →
DiamondShark © (2006-09-06 12:18) [15]
> А в чем разница?
Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.
← →
Cyrax © (2006-09-06 12:46) [16]DiamondShark © (06.09.06 12:06) [12]
Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.
Да, но в контексте программы это всё-таки оператор потокового вывода...
Вспомним вопрос vidiv: "Объясните смысл строки..., а точнее символов <<"...
Всё с точностью до наоборот. УМЧ.
Если это указатель, то хотелось бы увидеть фрагмент кода на паскале, где этот указатель меняет своё значение путём, скажем, инкременирования...
Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.
И ссулку, и указатель можно использовать в абстрактном понимании. Именно так это в паскале и делается... Но реализация того, что под этими терминами подразумевается, может быть как ссылкой, так и указателем. Это уже более строгий подход к пониманию этих терминов, где подобная абстракция приводит лишь к проблемам...
← →
guav © (2006-09-06 12:52) [17]> хотелось бы увидеть фрагмент кода на паскале, где этот указатель
> меняет своё значение путём, скажем, инкременирования...
пжалстаvar
I: Integer;
P: ^Integer;
begin
P := @I;
ShowMessageFmt("P points at %P", [P]);
Inc(P);
ShowMessageFmt("P points at %P", [P]);
end;
> ...в часности о http://delphimaster.net/view/15-1157465777/
>
> А что там такого, если не секрет ?
Мой вопрос про сишную обработку исключений.
← →
default © (2006-09-06 12:59) [18]штука в том, что указатель это путь к анархии в доступе к памяти:)
его значение можно менять получая доступ к памяти, возможно, непринадлежащей объекту на который исходной указывал указатель
ссылка такого не допускает, ссылка это нечто дающее возможность работать с самим объектом, а не его копией(вольное и не полное определение)
поэтому в managed коде указателей нет, есть ссылки их в большинстве случае заменяющие
← →
Alkid © (2006-09-06 13:33) [19]
> штука в том, что указатель это путь к анархии в доступе
> к памяти:)
> его значение можно менять получая доступ к памяти, возможно,
> непринадлежащей объекту на который исходной указывал указатель
> ссылка такого не допускает, ссылка это нечто дающее возможность
> работать с самим объектом, а не его копией(вольное и не
> полное определение)
> поэтому в managed коде указателей нет, есть ссылки их в
> большинстве случае заменяющие
Не совсем верно, в .NET-managed code они могут быть в unsafe-коде (C# позволяет такой делать). В его рамках и указатели есть и их арифметика и возможность нетипобезопасных приведений указателей друг к другу. В Java их и правда нет. Собственно спор "ссылки vs. указатели" - это спор обобщённости и эффективности. В каждой задаче есть своя специфика и есть свои средства решения. Где-то и на асме надо писать, где у тебя нет никаких обобщений, сплошная "машинная специфика".
← →
default © (2006-09-06 13:37) [20]Alkid © (06.09.06 13:33) [19]
unsafe код это неуправляемый, CLR закрывает на него глаза
если таковой встретится в среде недоверяющей небезопасному коду, то такой код вообще исполнен не будет
← →
default © (2006-09-06 13:46) [21]+[20]
пардон, я по запарке попутал управляемость с безопасностью
в безопасном коде нет указателей, а не в управляемом
← →
default © (2006-09-06 13:47) [22]"CLR закрывает на него глаза"
в смысле, что этот код не проходит верификацию
← →
default © (2006-09-06 13:51) [23]Alkid © (06.09.06 13:33) [19]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа, приведение к размерному типу создаёт копию
в MC++ это можно...
есть один выход - интерфейсы, но это не очень удобное
я было в один подумал, что такое возможно в unsafe коде, но хрен...:(
← →
Alkid © (2006-09-06 14:03) [24]Упакованного - это про boxing/unboxing?
← →
default © (2006-09-06 14:50) [25]Alkid © (06.09.06 14:03) [24]
ага
← →
Alkid © (2006-09-06 14:52) [26]А ты вообще по каким критериям решаешь, чему у тебя быть размерным типом, а чему - ссылочным?
← →
default © (2006-09-06 15:02) [27]Alkid © (06.09.06 14:52) [26]
а причём здесь это?
а критерии в мсдн-е есть когда стоит применять структуры вместо классов если ты об этом
← →
Cyrax © (2006-09-06 19:49) [28]Тьфу, блин. Запутался я с этими ссылками и указателями.
Но... если подумать... Есть в паскале и ссылки, и указатели (и это разные вещи !!!). Ссылки используются только для передачи параметров в функцию/процедуру (передача по ссылке). Т.е. ссылки в программе нельзя объявлять и использовать в отличие от указателей. А вот указатели в паскале - обычное дело.
guav © (06.09.06 12:52) [17]
var
I: Integer;
P: ^Integer;
begin
P := @I;
ShowMessageFmt("P points at %P", [P]);
Inc(P);
ShowMessageFmt("P points at %P", [P]);
end;
Это что - фокус? Хорошо... твоя взяла... :)
Мой вопрос про сишную обработку исключений.
Тебе нужна помощь или ты хочешь показать на примере исключений преимущества С... ?
default © (06.09.06 13:51) [23]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа...
Размерный - я так понимаю значимый (value). Т.е. хочешь сказать, что, допустим, если целое упакованное взять как объект, то не сможешь получить его значение (не распаковывая)... Правильно я тебя понял ?
приведение к размерному типу создаёт копию
Объект что - остаётся в куче ?
___________________________
А вообще, в C# много всяких ограничений и наворотов по сравнению с C++. Многие навороты в конце концов загромождают код и даже пересекаются друг с другом (частично дублируют свои функции), что не есть хорошо...
А вот по поводу ограничений, в частности отсутствие указателей (в безопасном коде) и шаблонов, - то это сильно урезает гибкость (часто и эффективность) средств разработки, доступных программисту.
← →
guav © (2006-09-06 20:28) [29]> Тебе нужна помощь
Мне уже вроде ответили, но если есть что добавить, давай.
> ты хочешь показать на примере исключений преимущества С...
> ?
Думаю речь о преимуществах С++, а не о преимуществах С, т.к. в С нет ни деструкторов ни исключений (стандартных).
Так вот, про преимущества обработки исключений в С++ .
Хотелось бы мне увидеть там преимущества.
Неужели действительно лучше паковать каждый динамический ресурс в класс (вынося код который был бы иначе в finally в деструкторы этих классов) и следить чтобы у этого класса конструктор не вывал исключения (т.е. не выполять в конструкторе ничего кроме выделения ресурса), чем просто использовать finally (и писать код функции в порядке выполнения) и использовать надёжно-вызываемые деструкторы, не задумываяь о возможных исключениях в конструкторах.
← →
default © (2006-09-06 20:35) [30]Cyrax © (06.09.06 19:49) [28]
> Размерный - я так понимаю значимый (value). Т.е. хочешь
> сказать, что, допустим, если целое упакованное взять как
> объект, то не сможешь получить его значение (не распаковывая).
> .. Правильно я тебя понял ?
ну распаковка по-любому нужна
распаковка собственно нужна, то есть без создания копии
есть соответствующая команда IL для этого
StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22
в MC++ такую проблему можно избежать
но подобные манипуляции редко, думаю, используются так что можно сильно не переживать по этому поводу:)
не распаковывая, естественно, я не получу допуступ ко всей функциональности размерного типа(ну, к примеру, какой-нибудь перекрытый ToString() можно заюзать ибо он в Object сидит :))
обидно то, что при распаковке создаётся неупакованная размерная копия упакованного размерного типа, то есть первой не сказывается на изменении последней...
то есть изменение этой распаковки не влияет на изменение в object-е..
например,
← →
default © (2006-09-06 20:37) [31]последний абзац не читать:) забыл выкинуть
← →
Cyrax © (2006-09-06 20:47) [32]guav © (06.09.06 20:28) [29]
Думаю речь о преимуществах С++, а не о преимуществах С
Я имел ввиду семейство языков C, ну за искл., чистого С...
Так вот, про преимущества обработки исключений в С++...
В общем, сначала гляну http://msdn2.microsoft.com/en-us/library/c70dax92.aspx... Но не щас... Запарился я на форуме - не спишь, не ешь. Так и зачахнуть можно...
P.S. Всё будет !!! ...
← →
evvcom © (2006-09-07 10:09) [33]> [15] DiamondShark © (06.09.06 12:18)
> Ссылка -- абстрактное понятие.
> Указатель -- машинно-зависимое.
Любая реализация языка программирования написана для реальной машины/платформы, пусть даже виртуальной. Т.е. получается, что пока речь идет о теории и каких-то абстрактных языках, то оперируем термином "ссылка", как только начинаем говорить о реальном языке, то говорим "указатель"?
> [28] Cyrax © (06.09.06 19:49)
> Есть в паскале и ссылки, и указатели (и это разные вещи
> !!!). Ссылки используются только для передачи параметров
> в функцию/процедуру (передача по ссылке). Т.е. ссылки в
> программе нельзя объявлять и использовать в отличие от указателей.
> А вот указатели в паскале - обычное дело.
"Передача по ссылке" - это общепринятое выражение. А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные. Так в чем же разница? Словоблудие и только. Мое имхо, это синонимы.
← →
Alkid © (2006-09-07 10:44) [34]
> А вообще, в C# много всяких ограничений и наворотов по сравнению
> с C++. Многие навороты в конце концов загромождают код и
> даже пересекаются друг с другом (частично дублируют свои
> функции), что не есть хорошо...
Хм. А какие навороты там друг с другом пересекаются?
> А вот по поводу ограничений, в частности отсутствие указателей
> (в безопасном коде) и шаблонов, - то это сильно урезает
> гибкость (часто и эффективность) средств разработки, доступных
> программисту.
Зато уменьшает количество возможностей отстрелить себе ногу. Огромные возможности - это всегда сила и слабость. Сила - потому что позволяет делать разные вещи быстро, красиво и эффективно. Слабость - потому что при неправльном приминении так же быстро и эффективно превращает программу в свалку мусора и глюков. Взять С++ - множественное наследование. Вещь, безусловно, очень толковая, но при неумелом использовании можно себя загнать в угол. Указатели - быстро, эффективно, но черевато. И так далее.
Ссылки в этом смысле проще и безопаснее. Да, с их помощью ты не сможешь записать произвольный байт по произвольному адресу, но это обычно и не надо. Если пишешь просто ОО-приложеие без хакерства, то ссылок более чем достаточно.
← →
Alkid © (2006-09-07 10:47) [35]
> Любая реализация языка программирования написана для реальной
> машины/платформы, пусть даже виртуальной. Т.е. получается,
> что пока речь идет о теории и каких-то абстрактных языках,
> то оперируем термином "ссылка", как только начинаем говорить
> о реальном языке, то говорим "указатель"?
Не совсем. А что если в какой-либо реализации .NET или Java ссылка - это
не указатель, а, например, индекс в таблице объектов? То есть реализация абстракции "ссылка" - это далеко не всегда обязательно указатель.
← →
evvcom © (2006-09-07 10:50) [36]> [35] Alkid © (07.09.06 10:47)
Вот с этим согласен.
← →
Cyrax © (2006-09-07 11:21) [37]> default © (06.09.06 20:35) [30]
StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22
А o.intfield не получится ? Ведь при упаковке создаётся объект и у етого объекта должно быть поле с числом 7...
Здесь в [object o = st] st упаковывается в кучу, а o начинает ссылаться на st (в куче) (пока имеем 7). (StructType) o распаковывает o в стек, меняем на 22 (7 уже не должно быть). Короче жуть получается.
Выходит, при упаковке/распаковке происходит не перемещение, а копирование. Это же УЖАС !!! Нарушается целостность данных !!!
Кто нибудь может вразумительно объяснить ?
И вообще, что в C# является значением ссылки (например, object o) - адрес объекта в куче ? Если так, то чем это не указатель ?
"При присваиваниях (замене аргументов) тип источника должен быть согласован с типом цели, то есть объект, связанный с источником, должен принадлежать классу, являющемуся потомком класса цели. В случае согласования типов, ссылочная переменная цели связывается с объектом источника и ее тип динамически изменяется, становясь типом источника."
не распаковывая, естественно, я не получу допуступ ко всей функциональности размерного типа
Имеется ввиду доступ к полю intfield в примере ?
(кстати, не читать - это значит неправильно ?)
Т.е. получается, что пока речь идет о теории и каких-то абстрактных языках, то оперируем термином "ссылка", как только начинаем говорить о реальном языке, то говорим "указатель"?
Я другого мнения. Возьмём, к примеру С++ - там и указатели, и ссылки...
Передача по ссылке" - это общепринятое выражение. А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные. Так в чем же разница?
Например, в С++ предача по указателю и по ссылке - разные вещи. Да и в паскале есть и передача по указателю, и по ссылке...
Так что, ИМХО, разное всё это...
А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные...
Чушь. Однозначно.
Значением ссылки являются данные, а указателя - адрес данных...
← →
Alkid © (2006-09-07 11:26) [38]
> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?
А это принципиально неизвестно. Может быть указатель, может быть не указатель, программе на C# это должно быть фиолетово. И вообще, значение ссылки - это объект.
> Я другого мнения. Возьмём, к примеру С++ - там и указатели,
> и ссылки...
Сдаётся мне, что reference в C++ и reference в Java/C# - это слишком разные вещи, что бы бросать их в одну кучу. Взять хотя бы то, что в C++ ссылки указывают всё время своей жизни на одно и то же, а в Java/C# могут менять объект, на котороый указывают и могут указывать на null.
← →
evvcom © (2006-09-07 12:30) [39]> [37] Cyrax © (07.09.06 11:21)
> Да и в паскале есть и передача по указателю, и по ссылке...
> Так что, ИМХО, разное всё это...
А... ну да... Поднялся на небеса (в смысле с низкого уровня программирования :) ) и стал понятен смысл того, о чем ты. :)
> Чушь. Однозначно.
> Значением ссылки являются данные, а указателя - адрес данных...
Да, да. Неверно выразился. Я в конструкции proc(var value) в паскале конечно же вижу данные по ссылке, но также четко представляю, что в процедуру (смотрим асм) передается на самом деле указатель. А уже интерпретация этого value (адрес или данные) лежит на совести шамана-компилятора. :)
← →
default © (2006-09-07 13:16) [40]Cyrax © (07.09.06 11:21) [37]
> А o.intfield не получится ?
да, не получится
> Ведь при упаковке создаётся объект и у етого объекта должно
> быть поле с числом 7...
да, но оно не доступно без распаковки(ты пойми, что в переменной типа object может храниться ссылка на экземпляр абсолютно любого типа, о каком o.intfield может идти речь?)
> Выходит, при упаковке/распаковке происходит не перемещение,
> а копирование. Это же УЖАС !!! Нарушается целостность данных
> !!!
> Кто нибудь может вразумительно объяснить ?
ничего не нарушается, всё нормально, разве что код выдаёт несколько неестественный по виду кода результат
вот что я думаю
когда мы работаем с размерными типами изменение какого-либо экземпляра размерного типа не сказываются на чём-либо другом, это для нас понятно и естественно
не удивляемся же мы коду
int x = 5;
int y = x;
y = 7; // x = 5!
предположим такое
StructType st; // выделение в стеке памяти под переменную
st.intfield = 7; // инициализация перед использованием переменной
object o = st; // boxing
StructType v = (StructType) o; // предположим здесь не
//создаётся копия в стеке, а имеем доступ
// через переменную v к запакованному размерному типу ссылка
// на который хранится в переменной o
v.intfield = 22; // вносим изменения, здесь нарушение единообразия
//происходит, изменение размерного экз-ра типа сказывается на
//упакованном экз-ре размерном типе
Console.WriteLine(((StructType) o).intfield); // выведется 22
поэтому то, что в C# unboxing всегда действует в купе с копированием, для меня разумно, единообразие штука необычайно полезная
> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?
уже объяснил Alkid
> Имеется ввиду доступ к полю intfield в примере ?
> (кстати, не читать - это значит неправильно ?)
да
правильно, только я подумал лучше на примере показать о чем речь, а то забыл из поста убрать
Страницы: 1 2 3 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.6 MB
Время: 0.046 c