|
|
Cho em hỏi ngoài 3 cái trên complier còn sinh thêm những cái gì ạ, anh có thể vd cho em vài cái đc không
thanks
|
|
|
http://rapidshare.de/files/38232037/Addison-Wesley-tcpip-illustrated.pdf.gz.html
|
|
|
Mình có 1 vài vấn đề cần mọi người giúp đỡ thảo luận. Trước hết xét 2 đoạn mã sau:
Code 1:
Code:
#include"iostream"
using namespace std;
void display(){
int y=-2;
cout<<&y<<endl;
}
int main(){
int x=-1;
cout<<&x<<" ";
display();
return 0;
}
Code 2:
Code:
#include"iostream"
using namespace std;
void display(){
int y=-2;
cout<<&y<<endl;
}
void hien(){
display();
}
int main(){
int x=-1;
cout<<&x<<" ";
hien();
return 0;
}
Mình complier của 2 đoạn mã và chạy đi chạy lại chúng nhiều lần thì thấy khoảng cách địa chỉ của x và y trong 2 đoạn mã là không giống nhau . VD như trên máy mình thì trong Code 1 là 44 còn Code 2 là 60.
Thứ 1: Tại sao khoảng cách địa chỉ của x, y lớn đến vậy, -> có 1 vùng nhớ nằm giữa 2 biến x, y.
Thứ 2: Tại sao tại sao khoảng cách địa chỉ của 2 đoạn mã là khác nhau.
Còn đây là lập luận của mình về 2 vấn đề trên mọi người xem có đúng không:
Như ta đã biết 1 chương trình gồm nhiều hàm được tạo lên, mỗi 1 hàm tương ứng với 1 stack frame. Mỗi khi 1 hàm được gọi thì 1 stack frame được tạo ra, và khi hàm đó trở về (function return ) thì stack frame của hàm đó bị giải phóng.
Mỗi 1 stack frame chứa 3 thông tin:
1. Tham số truyền vào
2. Biến local của hàm
3. dòng lệnh trong doạn mã mà hàm trở về (number line function return ) hay trong nhiều sách còn viết là địa chỉ mà hàm đó thực hiện (the address at which the function is executing)
vấn đề 1: Chính vì stack frame chứa 3 thông tin trên nên trong 2 đoạn mã địa chỉ của x và y cách xa nhau đến vậy.
vấn đề 2: Do trong code 2 có 3 stack chứ không phải 2 stack như trong code 1 nên khoảng cách địa chỉ giữa 2 đoạn mã là khác nhau.
Không biết thế đã đúng chưa . Mong mọi người vào ủng hộ
|
|
|
Hì thế thì lạ nhỉ em build trên Kdevelop với complier 4.1.2 phiên bản gần mới nhất rùi còn gì.
|
|
|
Uh do trỏ tới eof rùi nên không seek đc. Chủ đề chấm dứt rất cám ơn sự tham gia nhiệt tình của các bạn đặc biết là secmask (Hix có mỗi 1 người tham gia thao luận )
|
|
|
ạc Đang trong C++ mà liên quan gì tới java.
ngoài ra mọi người vào đây xem http://forum.vnoss.org/viewtopic.php?id=5577 để hiểu thêm đôi chút
|
|
|
ừ bạn nói đúng lần đọc thứ 5 sẽ fail do đó x không thay đổi vì thế in số 4 lần thứ 2.
Mình xin nói rõ về cấu trúc của file tệp. Một tệp có cấu trúc gồm nhiều cửa sổ tệp trong đó có của sổ tệp cuối cùng là eof (viết tăt của End Of File) . Các bạn chú ý khi mở tệp với chế độ ios::app hoặc ios::ate thì vị trí của con trỏ tệp lúc này không phải là trỏ tới EOF , vị trí của ios::app (ios::ate) là nằm liền trước vị trí eof. Tại vị trí ios::app (ios::ate) ta không thể nào thực hiện việc đọc file được do đó , tuy vậy nếu ta vẫn cố tình đọc file như trong bài toán trên thì biến x sẽ không được gán đè lên 1 giá trị nào đó ( giá trị của x ko thay đổi) , mặc dù việc đọc file có lỗi nhưng con trỏ tệp vẫn chuyển sang cửa sổ tệp tiếp theo là EOF.
Vấn đề 1 được giải quyết . Vậy còn vấn đề 2 mọi người giải thích coi
|
|
|
hè hè ai kêu ông là đọc xong 4 phần tử kìa là sẽ chuyển dến eof. Nếu nói như ông thì nếu ta mở tệp ở chế độ cuối tệp thì nó là eof hả? Điều này là không đúng.
|
|
|
1. sorry tại vì kiểu int trong máy mình là 4 byte nên mình viết luôn là như vậy
2. đúng là vẫn ở trong vòng lặp nhưng tại sao nó lại in ra 2 lần số cuối cái đó bạn vẫn chưa trả lời đc
3. mình cố ý làm như vậy để các bạn thấy đc rằng khi mà con trỏ ptr trỏ tới eof thì không thể nào dịch chuyển con trỏ được
4. thêm 1 lần nữa sorry vì sizeof(int ) của máy mình là 4byte
|
|
|
Hôm nay mình xin được trình bày về vào ra tệp trong C++ , có vài điều lý thú có thể có những người chưa biêt.
Mình xin đặt ra vấn đề các bạn thử lý giải xem tại sao.
Code:
#include"iostream"
#include"fstream"
using namespace std;
void ghifile(){
ofstream ptr("Doc.dat",ios::out|ios::binary);
for(int i=1;i<5;++i)
ptr.write((char*)&i,4);
ptr.close();
}
void docfile(){
int x=-1;
fstream ptr("Doc.dat",ios::in|ios::binary);
while(ptr){
ptr.read((char *)&x,4);
cout<<x<<endl;
}
ptr.seekg(0,ios::beg);
if(ptr.eof()) cout<<"error"<<endl;
ptr.close();
}
int main(){
ghifile();
docfile();
return 0;
}
khi chương trình sẽ in ra màn hình :
Code:
các bạn hãy lý giải tại sao in ra 2 lần số 4 và tại sao câu lệnh " ptr.seekg(0,ios::beg)" lại khộng thực hiện
|
|
|
vì sizeof(int) =4 cái này là tùy vào hệ điều hành. VD như Windows và Linux thì kich thước kiểu int là 4 byte còn trên nên DOS thì là 2 byte
|
|
|
hix có lẽ tại em nhìn nhầm số trong hệ hex sang hệ dec
hì hì Sorry
|
|
|
2 cuốn nổi tiếng Thinking in C++ và The C++ Programming Language Special 3rd Edition
|
|
|
Chắc hẳn mọi người đã quá quen thuộc với struct nhưng không hẳn ai cũng đã rành về nó. Chắc mọi người đều nghĩ struct là một kiểu dữ liệu do người dùng định nghĩa và nó chỉ là 1 trường hợp đặc biệt của class vì nó giống với class khi khai báo thuộc tính trong phạm vi public .Nhưng điều này chỉ đúng trong C còn C++ thì khác hẳn nó được mở rộng tương đương với class . Tất cả những gì class làm đc thì struct cũng làm được . Class có private,protected,public, có phương thức, hàm bạn , lớp bạn, hàm khởi tạo....thì struct cũng có và thậm chí cả kế thừa. Bạn có thể làm 1 bài test với class rồi sau đó thay tất cả từ khóa class bằng từ khóa struct
Một ví dụ nhỏ :
Đối với class :
Code:
#include"iostream"
using namespace std;
class person{
private:
char name[20];
int age;
public:
void nhap(){
cout<<"nhap ho va ten:";
cin.getline(name,20);
cout<<"nhap tuoi";
cin>>age;
}
void show(){
cout<<name<<" tuoi "<<age;
}
};
int main(){
person a;
a.nhap();
a.show();
return 0;
}
Đối với struct:
Code:
#include"iostream"
using namespace std;
struct person{
private:
char name[20];
int age;
public:
void nhap(){
cout<<"nhap ho va ten:";
cin.getline(name,20);
cout<<"nhap tuoi";
cin>>age;
}
void show(){
cout<<name<<" tuoi "<<age;
}
};
int main(){
person a;
a.nhap();
a.show();
return 0;
}
Đây chỉ là 1 ví dụ nhỏ còn nhìu điều thú vị nữa các bạn có thể tự tìm hiểu
P/S: My website: http://thegioiquay.tk
|
|
|
Mình có đoạn code:
Code:
#include"iostream"
using namespace std;
class Foo{
int i;
public:
Foo(){
cout<<this<<endl;
}
};
int main(){
Foo foo[4];
return 0;
}
Chương trình sau khi complie và chạy thì thu đc kết quả sau:
0xbfe24e04
0xbfe24e08
0xbfe24e0c
0xbfe24e10
Câu hỏi: Tại sau các địa chỉ ko cách đều nhau???
|
|
|
_BlacK_EyE_ wrote:
cái này theo logic phải dẫn đến việc là *p = a = 0 !
Thật là tai hại khi bạn hiểu nhầm về con trỏ, vùng nhớ heap và hàm new/delete .
Bạn hãy tìm hiểu xem con trỏ là gì.
Khi nào thì dùng delete. (Không phải lúc nào cũng dùng delete bừa bãi được đâu)
|
|
|
bạn đã kiểm tra đĩa download về đã đúng chưa và việc ghi file có lỗi gì không
P/s file download về là file *.iso nên khi ghi đĩa thì chọn burn from image
|
|
|
Hiện mình đang đọc về cuốn debugger http://www.dirac.org/linux/gdb/index.php ,trong đó có bài tập và mình gặp vướng mắc về vài câu hỏi trong đó ai giúp mình trả lời với.
Câu: 1/ Cho đoạn mã co tên hello_world-1.c:
Code:
1 // hello_world-1.c
2
3 #include <stdio.h>
4
5 int main(void)
6 {
7 printf("hello world\n");
8
9 return 0;
10 }
sau đó dùng lệnh:
Code:
$ gcc -W -Wall -c hello_world-1.c
$ gcc -o hello_world-1 hello_world-1.o
tiếp đó dùng lênh "size" và lệnh "objdump -h" thì thu được kết quả sau:
Code:
$ size hello_world-1 hello_world-1.o
text data bss dec hex filename
916 256 4 1176 498 hello_world-1
48 0 0 48 30 hello_world-1.o
$ objdump -h hello_world-1.o
hello_world-1.o: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000023 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000058 2**2
ALLOC
3 .rodata 0000000d 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .note.GNU-stack 00000000 00000000 00000000 00000065 2**0
CONTENTS, READONLY
5 .comment 0000001b 00000000 00000000 00000065 2**0
CONTENTS, READONLY
câu hỏi:
_Tại sao lệnh size không in ra vùng nhớ heap và stack của file hello_world or hello_world.o
_Trong đoạn code của file hello_world.c không có biến toàn cục nào cả, tại sao lệnh size nó in ra dung lượng bộ nhớ data và bss của file hello_world.o là 0 nhưng của file thực thi hello_world thì lại là số khác 0
_Tại sao size và objdump lại in ra dung lượng vùng nhớ text segment khác nhau.
Câu 2:
_Có khi nào 1 cấu trúc stack trong vùng nhớ stack bị giải phóng trở về vùng nhớ unused memory không? nếu có thê thì chương trình sẽ như thế nào.
_Can a goto() statement cause frames in the middle of the stack to be deallocated? The answer is no, but why?
_Can longjmp() cause frames in the middle of the stack to be deallocated?
(Ngại dịch quá bà con dịch và trả lời giúp )
Thanks.....
|
|
|
Mình thấy trong Windows và linux đề có commands copy file. Tiện học về vào ra tệp mình định viết 1 đoạn mã để copy 1 file thanh nhìu file nhưng mà khổng thể nào viết nổi bạn nào giúp mình với.
Giả sử mình có 1 file gốc không biết nội dung bên trong nó là gì ,yêu cầu: bạn hãy tạo ra những file copy của file đó
Thanks.....
|
|
|
thế thì cần xài bản server
|
|
|
Uh` cám ơn FAL mình kiểm tra lại rồi đúng lại rồi
ta đổi 2 số a và b sang số nhị phân thì được là a=101 còn b=110 . Khi đó
a^b==101^110==011 và chuyển sang hệ dec (hệ số đếm 10) thì bằng 3
Nhưng còn về phần mã hóa thì sao lại nói là nguy hiểm đúng là khi viết C=P^K , nếu ta biết đc C, P thì tính đc K dễ dàng nhưng có gì là nguy hiểm đâu
|
|
|
hix mọi người tranh luận sôi nổi quá. hì hì.......
Thực ra thì toán tử XOR trên bit thì mình biết rồi còn với số thực thì nó tườn đương với phép trừ
vd:
c=a^b;
tương đương với c=a-b;
Khoai có thể nói rõ hơn là tại sao không an toàn không vì mình thấy xài nó rất nhanh, thích hợp tối ưu đoạn mã
|
|
|
Mình đọc được 1 cuốn tối ưu thuật đoạn mã thấy có viết xài toán tử XOR trong việc hoán vị 2 số
đoạn mã như sau:
void hoanvi(int &a,int &b){
a=a^b;
b=a^b;
a=a^b;
}
Bạn nào có thể giải thích cụ thể cho mình chi tiết về đoạn mã kia với. Giả sử khi minh nhập số a=5 và số b=6 thì trong dòng lênh thứ nhất a=a^b; nó cho bằng 1 số bất kì là 3 chẳng hạn . Mình muốn hỏi rằng: làm sao ta biết đc trong dòng lệnh thứ nhất a bằng bao nhiu (tức là biết đc chính xác số bất kì kia sẽ là bao nhiu)
Tiếp đến là dòng lệnh thứ 2 b=a^b; trong câu lệnh này b sẽ được gán giá trị 5 nhưng 1 vấn đề mình tự hỏi là tại sao lại là con số 5 mà không là con số khác vì dòng lệnh thứ 2 và thứ 1 là khá giống nhau vế phải dều là a^b chỉ khác 1 cái là a=5 và 1 cái a=3 . Tại sao không cho ra 1 con số bất kì như dòng lệnh 1.
Tiếp theo dòng lệnh thứ 3 tương tự như dòng lệnh thứ 2 a được gán giá trị 6
Mọi người hãy giải thích giúp mình với. Thanks
|
|
|
thanks mod....
|
|
|
Hiện tại mình đang học C/C++, mọi người cho hỏi dùng cái gì thiết kế giao diện phần mềm trên Linux . Mình chưa đọc đến phần đồ họa viết bằng C/C++ nên không rõ là:
Ngôn ngữ C++ có thiết kế đc giao diện cho phần mềm không? Nếu không thì dùng ngôn ngữ gì hay phần mềm gì để thiết kế hả? (em đang xài linux)
Hỏi thêm: Phần đồ họa trong C++ có mạnh không?
|
|
|
Hướng dẫn cài đặt về Fedora qua ổ đĩa cứng thì có rất nhìu rồi .Nhưng mình có thể nói qua các bước của nó.
Yêu cầu:
bạn phải có file iso dvd của Fedora mà bạn muốn cài nằm trên phần vùng Fat32(đối với Windows) . bạn phải burn ra đĩa 1 file F-7-i386-rescuecd.iso
Thực hiện quá trình cài đặt:
cho boot máy từ đĩa F-7-i386-rescuecd.iso sau đó nó hiện nên lựa chọn boot thì bạn ấn phím tab rồi xóa chữ rescuecd . Sau đó thì enter , nó sẽ load đến các bước thực hiện tiếp bạn làm theo cho đến khi nó hỏi cài đặt qua ổ đĩa cứng hay qua mạng ... thì bạn chọn cài từ ổ cứng. Sau đó nó sẽ hiện thông báo bặt bạn phải điền đường dẫn tới file iso dvd , lúc này bạn phải xác định file đó nằm trên partion nào sdax (hoặc hdax) để biết điều này bạn nên xài fdisk -l , khi xác định đc phân vùng chứa file iso thì bạn điện đường dẫn tới file đó ở ô phía dưới .
VD: nếu ta có file iso nằm ở E:/setup/linux/F-7-i386-DVD.iso thì đường dẫn bạn phải điển ở đây là setup/linux/
còn nếu trên Linux file iso nằm ở partion sdax (sdax đc mount tới /media/data) đường dẫn trên hệ điều hành linux tới file iso đó là /media/data/setup/linux/F-7-i386-DVD.iso thì đường dẫn bạn phải điền ở đây là setup/linux/
sau đó khi điền đường dẫn xong thì enter nó sẽ load tới file đó và bạn cài đặt Fedora như bình thường
|
|
|
Lần sau cần xem xét kĩ sự việc nhé đừng gõ sai lỗi "chính tả" như thía
p/s:việc vòng lặp chạy ko dừng thì nên kiểm tra điều kiện của vòng lặp .
|
|
|
kiểm tra xem các file download về có lỗi ko . Thường thì là do gói đó download lỗi nên ko cài đc
|
|
|
hey nhuhoang, pass sai rồi
|
|
|
cám ơn bạn về cái vấn đề 2 cái này mình cũng nghĩ là như vậy . Còn cái vấn đề 1 thì mình làm xây dựng phép nhân matrix trong hàm main() thì đúng rồi còn việc xây dựng 1 hàm con thì ko làm đc như đã nói ở trên
|
|