banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Messages posted by: hoalong_317  XML
Profile for hoalong_317 Messages posted by hoalong_317 [ number of posts not being displayed on this page: 0 ]
 
Em có đoạn code java sau:
Code:
public class A
{
}
public class B
{
private A as;
public B(A as)
{
this.as = as;
// tạo phương thức khởi tạo cho lớp B
}
}

khi tạo đối tượng trong java thì ta tạo đối tượng của lớp A trước sau đó tạo đối tượng lớp B và truyền tham số khởi dựng vào (tham số là đối tượng của lớp A)
Do lập trình java nhiều nên khi chuyển sang C++ em muốn làm tương tự như vậy nhưng trình dịch báo lỗi, cụ thể đoạn mã của em như sau:
Code:
class A
{
private :
public :
}
class B
{
private :
A as;
public :
B(A); // tạo phương thức khởi dựng cho lớp B với đối số truyền vào là đối tượng lớp A
friend class A
}
B::B(A as)
{
this.as = as;
}

mong mọi người có thể giải thích cho em cơ chế làm việc của C++ như thế nào
Em có một số thắc mắc xin mọi người có thể giải đáp thắc mắc:
Hiện tại em muốn tạo một process thực hiện một lệnh, sau khi process thực hiện lệnh này xong thì làm cách nào để lấy kết quả trả về của lệnh đó trong process.
Còn một câu hỏi hơi ngu đó là một thread con có thể tạo một process không, về nguyên tắc 1 process tạo ra các thread nhưng em thấy thread chính (ở đây là main) có thể tạo ra một process con thì thread con cũng có thể tạo ra một process con.
đúng là như thế thật, %s sẽ đọc các kí tự cho đến khi gặp khoảng trắng hoặc \n, cảm ơn bạn
mọi người có thể giải thích cho em tại sao trong 2 cách khai báo chuỗi như thế này thì kết quả show ra lại khác nhau như vậy
đoạn code thứ nhất
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
char str[20];
char *ptr1,*ptr2;
printf("nhap chuoi :");
scanf("%s",str);
ptr1 = strtok(str," :");
ptr2 = strtok(NULL," :");
printf("chuoi thu nhat %s",ptr1);
printf("chuoi thu hai %s",ptr2);
getch();
return 0;
}

đoạn code thứ 2
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
char str[] = "demo : baitap";
char *ptr1,*ptr2;
ptr1 = strtok(str," :");
ptr2 = strtok(NULL," :");
printf("chuoi thu nhat %s",ptr1);
printf("chuoi thu hai %s",ptr2);
getch();
return 0;
}

giả sử trong đoạn code 1 ta nhập đầu vào cũng là demo : baitap
khi thực hiện chạy 2 đoạn code này thì đoạn code thứ nhất hiển thị kết quả là demo và null, với đoạn code thứ 2 thì hiển thị ra đúng kết quả mong đợi là demo và baitap
em không chắc lắm về phỏng đoán của mình nhưng theo em nghĩ thì có lẽ cuối chuỗi nhập vào trong đoạn code thứ nhất có cái gì đó không ổn (có thể là chứ một kí tự lạ nào đó nhưng cũng không phải bởi vì em đã đếm số kí tự và thiết lập số phần tử bằng đúng với chiều dài của chuỗi, cũng có thể là không có \0 nhưng theo lý thuyết thì một chuỗi luôn có \0 đằng sau để đánh dấu kết thúc chuỗi)

char *buffer = "demo%20bai tap";
Đây là bạn lấy địa chỉ để lưu 1 giá trị cụ thể -> sai.
 

Cái này không sai bạn à, con trỏ buffer ở trên dùng để trỏ tới vùng nhớ chứa chuỗi "demo%20bai tap" chứ không phải lấy địa chỉ của nó để lưu giá trị đó.

Bạn muốn lưu nội dung vào thì hình như tớ nhớ ko nhầm bạn cần phải cất thế này:
**buffer: nghĩa là nội dung của con trỏ *buffer.
 

Bạn lại nhầm về con trỏ rồi, khai báo **buffer là con trỏ trỏ tới con trỏ tức là buffer sẽ lưu địa chỉ của một con trỏ(bản chất con trỏ cũng là một biến nên nó cũng có địa chỉ trong ô nhớ) chứ không phải lưu nội dung của con trỏ , nội dung và địa chỉ là 2 cái khác nhau hoàn toàn
Theo như giải thích của bạn n2tforever là có cơ sở, tôi cũng thấy kì lạ khi không thể write vào vùng nhớ được
Vì em không rõ lỗi chính xác có nằm ở việc cấp phát bộ nhớ con trỏ hay không nên em để tiêu đề chung chung, mong mọi người có thể giải đáp thắc mắc này, em có đoạn code sau :
Code:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *buffer = "demo%20bai tap";
char tempCode[3] = {0};
int j;
for(int i = 0;i< strlen(buffer);i++)
{
if(buffer[i] == '%')
{
tempCode[0] = buffer[i+1];
tempCode[1] = buffer[i+2];
buffer[i] = strtol(tempCode,NULL,16);
j = i +1;
do
{
buffer[j] = buffer[j+2];
}while(buffer[2+(j++)]);
}
}
printf("\n %s \n",buffer);
getch();
return 0;
}

trong đoạn code trên nếu thay khai báo char *buffer = "demo%20bai tap"; thành char buffer[20] = "demo%20bai tap"; thì chương trình lại chạy bình thường, về mặt bản chất cả 2 khai báo trên là tương đương nhau vậy tại sao cách khai báo thứ nhất lại bị lỗi và lỗi xuất hiện tại dòng code sau
Code:
buffer[i] = strtol(tempCode,NULL,16);
 

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|