Elementaren "C" Vapros!
6 отговора
403 прегледа
Elementaren "C" Vapros!
Ima li nachin 'funcition' na C-to da vrashta poveche ot edin rezultat, kakto e v pascal?
primer
a=5;
b=6;
c=7;
void ff(int a, int b)
{ a=b;
c=b;
}
v C-to SLED kato funciata se varne v glavnata programa, a<>b<>c!
a v pascal:
procedure(var a, b, c : integer);
begin
a:=b;
c:=b;
end;
sled kato mine procedurata a=b=c....
primer
a=5;
b=6;
c=7;
void ff(int a, int b)
{ a=b;
c=b;
}
v C-to SLED kato funciata se varne v glavnata programa, a<>b<>c!
a v pascal:
procedure(var a, b, c : integer);
begin
a:=b;
c:=b;
end;
sled kato mine procedurata a=b=c....
Re: Elementaren "C" Vapros!
Ami ako e Pure C ste tribawa da izpozwash ukazateli:
void func(int * pn1, int * pn2)
{
*pn1 = 1;
*pn2 = 2;
}
i kato izwikwash syotwetno:
int n1, n2;
func(&n1, &n2);
w C++ ima mnogo po krasiw nachin s izplzwane na psewdonimi:
void func(int& n1, int& n2)
{
n1 = 1;
n2 = 2;
}
i syotwetno:
int n1, n2;
func (n1, n2);
i pak se wrysta rezultata prez parametrite. Ama pak kazwam che wrotia e samo za C++.
Uspeh!

void func(int * pn1, int * pn2)
{
*pn1 = 1;
*pn2 = 2;
}
i kato izwikwash syotwetno:
int n1, n2;
func(&n1, &n2);
w C++ ima mnogo po krasiw nachin s izplzwane na psewdonimi:
void func(int& n1, int& n2)
{
n1 = 1;
n2 = 2;
}
i syotwetno:
int n1, n2;
func (n1, n2);
i pak se wrysta rezultata prez parametrite. Ama pak kazwam che wrotia e samo za C++.
Uspeh!
Mnogo mersi, za otklika, no ne stava...
Variant A: ne se kompilira
void strcopy(char& str1, char& str2)
{
str1=str2;
}
call:
char str1[10];
char str2[10];
strcopy(str1, str2);
Varnat B - pak ne se kompilira:
void strcopy(char* str1, char* str2)
{
*str1=*str2;
}
char str1[10];
char str2[10];
strcopy(&str1, &str2);
Error:
ex5.cpp(151) : error C2664: 'strcopy' : cannot convert parameter 1 from 'char (*)[10]' to 'char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Izplzam MSVC++ 6.0
void strcopy(char& str1, char& str2)
{
str1=str2;
}
call:
char str1[10];
char str2[10];
strcopy(str1, str2);
Varnat B - pak ne se kompilira:
void strcopy(char* str1, char* str2)
{
*str1=*str2;
}
char str1[10];
char str2[10];
strcopy(&str1, &str2);
Error:
ex5.cpp(151) : error C2664: 'strcopy' : cannot convert parameter 1 from 'char (*)[10]' to 'char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Izplzam MSVC++ 6.0
Re: Mnogo mersi, za otklika, no ne stava...
a sto napravo ne probvash sas strcpy(str1,str2); ili strncpy(str1,str2,sizeof(str2));
Tva sa si ANSI C funkcii za rabota sas stringove .....
Tva sa si ANSI C funkcii za rabota sas stringove .....
Редактирано от Goose на
Re: Mnogo mersi, za otklika, no ne stava...
Wij sega. Ima razlika mejdu char[10] i char i to ogromna. i za topwa e normalno teia funkcii da rabotiat po toia nachin. Problemite ti idwat i doniakyde che w sluchaia dwata masiwa sa w stack-a a ne sa dinamichni. Naj-dobre raboti s dinamichna pamet. A moite primeri sa si korektni no pak kazwam che sa masiwi e po razlichno. Osobeno kato izpolzwash C++ kompilator. Eto ti edin primer kojto doniakyde zaobikalia problema:
#include "stdio.h"
void strcopy1(char*& str1, char*& str2)
{
str1 = str2;
}
int main(int argc, char* argv[])
{
char str1[10] = {'1', '1','1','1','1','1','1','1','1','\0'};
char str2[10]= {'2', '2','2','2','2','2','2','2','2','\0'};
char * cha1 = str1;
char * cha2 = str2;
printf("%s\n", str1);
printf("%s\n", str2);
strcopy1(cha1, cha2);
printf("%s\n", cha1);
printf("%s\n", cha2);
return 0;
}

#include "stdio.h"
void strcopy1(char*& str1, char*& str2)
{
str1 = str2;
}
int main(int argc, char* argv[])
{
char str1[10] = {'1', '1','1','1','1','1','1','1','1','\0'};
char str2[10]= {'2', '2','2','2','2','2','2','2','2','\0'};
char * cha1 = str1;
char * cha2 = str2;
printf("%s\n", str1);
printf("%s\n", str2);
strcopy1(cha1, cha2);
printf("%s\n", cha1);
printf("%s\n", cha2);
return 0;
}
Re: Mnogo mersi, za otklika, no ne stava...
И освен това
//
не е никакво копиране. Не знам какво се е имало в предвид, но ако се иска в памитта сочена от str1 да се копира null-terminated string str2, програмата може да се напише така
//
Така работи стандартната функция char *strcpy(char *, char *). Когато се извиква stringcopy() трябва да сме сигурни, че паметта сочена от str1 е достатъчно голяма, за да побере всички символи от str2 плюс 1 null-terminator. Може да се извиква така:
void strcopy(char *str1, char *str2)
{
str1 = str2;
}
//
не е никакво копиране. Не знам какво се е имало в предвид, но ако се иска в памитта сочена от str1 да се копира null-terminated string str2, програмата може да се напише така
char *stringcopy(char *str1, char *str2)
{
char *p = str1;
while((*p++ = *str2++) != '\0')
;
return (str1);
}
//
Така работи стандартната функция char *strcpy(char *, char *). Когато се извиква stringcopy() трябва да сме сигурни, че паметта сочена от str1 е достатъчно голяма, за да побере всички символи от str2 плюс 1 null-terminator. Може да се извиква така:
#include <stdio.h>
void main(void)
{
static char str2[] = "0123456789"; // размера на str2 е 11 = 10 символа плюс 1 за null-terminator-a
char str1[10+1]; // за да може в str1 да се побере str2 ни трябва размер >= 11
stringcopy(str1, str2);
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
printf("sizeof(str2) = %d\n", sizeof(str2)); // обърни внимание какъв е размера на str1[]
}
Re: Elementaren "C" Vapros!
ne se pritesnqwai 4e ne razbira6 towa e za6toto o6te ne si zapoznat s ukazatelite nai wavnoto w C w pascal wsi4ko se preobrazuwa samo a w C ne e to4no taka za6toto C[10] e to4no kato nqkoi masiw na pascal (array) i nemove prosto taka da kave6 a=b; kydeto a i b sa ot tip chat C[10]; towa go ima w C++ no se izpolzwa specialen klas za towa void Func(char *a,char *b); a i b sa adresite na parametrite koito podawa6 na wunkciqta a void Func(char &a, char &b); ot C++ e sy6toto samo 4e se prawi skrito i se izpolzwa za ulesnenie probwal li si na paskal procedure Func(a,b:integer); imam predwid bez towa var koeto slaga6 6toto to se slaga ako iska6 da promeni6 a i b drugo wavno e 4e na pascal ako ima6 var name:string; towa e po razli4no ot char name[10]; po mnogo ne6ta po skoro e char *name; i ne move kato na pascal da pi6e6 var a,b:string; a=b; i da 4aka6 da raboti towa go ima w C++ tam ima string i we4e move string a,b; a=b; towa raboti taka 4e moq sywet e ako sega po4wa6 da u4i6 C/C++ zapo4ni ot ukazatelite bez tqh si za nikyde
uspeh nikak ne sa lesni
uspeh nikak ne sa lesni