Gặp lỗi về con trỏ

Em gặp lỗi hàm CheckArry khi thực thi đến hàm này đơ vài giây sau đó kết thúc chương trình luôn

#include <stdio.h>
#include <cstdlib>
#include <stdbool.h>
bool CheckArray(int **arr,int index){
fflush(stdin);
char temp;
printf("\ntest0 \n");
if( scanf("%d%c",&(arr)[index], &temp)  == 2){
printf("\ntest 1 \n");
		if(temp == '\n')
		printf("\ntest 2 \n");
			return true;
	}
	return false;
} 

void addValue(int **arr , int &size){
	fflush(stdin);
	size++;
	arr = (int**) realloc(arr, (size) * sizeof(int*));
	printf("Input number to array:");
	while( !CheckArray(arr, size-1 ) ){
		printf("Invaild a value: ");
	};
	//scanf("%d",arr+(size-1));
	printf("Number of array: %d",arr[size-1]);
}

bool CheckMenu (int *number , int min , int max  ) {
fflush(stdin);
char temp;
printf("Input menu:\n");
if( scanf("%d%c", number, &temp)  == 2)
	{
		if((temp == '\n') && ((*number >= min) && (*number <= max)))
			return true;
	}
	return false;
}
void menu(int **arr, int &size){
	int number ;
	while(true){
	if(number == 6 ) break ;
	printf("----Chuong Trinh----\n");
	printf("1. Add a value\n");
	printf("2. Search a value\n");
	printf("3. Print out array \n");
	printf("4. Print out values in range inputted min and max values, inclusively\n");
	printf("5. Sort the array in ascending order\n");
	printf("0. Exit\n\n");
	while(!CheckMenu( &number, 1,6 ) ){
		printf("loi roi nhap lai di \n");
	}
	switch (number)
   {
      case 1:	addValue(arr,size) ;      	  break;
      
   }
}
}
int main(){
	int  size = 1;
	int *arr;
	arr = (int *)malloc(size* sizeof(int));
	menu(&arr,size);
	free(arr);
	return 0 ;
}

Hmmm…
Anh cho em hỏi 1 chút là có vẻ như bài của anh chỉ cần đến mảng 1 chiều nhưng em thấy anh dùng khá p2p(viết tắt của pointer to pointer ấy ạ) khá nhiều. Anh có thể giải thích giúp em tại sao lại dùng p2p đc không ạ

Hmmm…
Phía trên anh truyền vào p2p vậy tức arr là p2p nhưng ở dòng này em thấy anh scanf với format %d cho 1 pointer. Cái này liệu có đúng không nhỉ mọi người. Em tưởng C không gán giá trị được viết sẵn cho pointer được mà nhỉ. Kiểu không được làm thế này : int *p = 2F5A8B2 mà phải làm thế nàyint *p = &n. Em hiểu thế có đúng không nhỉ :thinking:

5 Likes

THEO DÒNG TÂM TRÍ CỦA MỘT THẰNG TỰ KỶ NÀO ĐÓ MÌNH COPY TRÊN MẠNG ĐƯỢC… không rõ nguồn thấy xàm chóa nên mình để tạm đây.

  • Thực sự đề bài yêu cầu mình làm gì zậy ta? Ẹ hem nó kêu mình viết hàm thêm phần tử vào mảng số nguyên hả ta. Hay kiu mình thêm học sinh vào lớp nhỉ? Đóa xong bạn vắn tắt iu cầu đề bài => lầm bẩm trong đầu tránh lạc đề. CHỈ NHỚ MỘT Ý CHÍNH THÔI không cần nhớ hết ý phụ.

  • Xong chịu khó viết cái gọi là giải pháp cho duy nhất một vấn đề trên. cái bảng vầy

        1. IU CẦU: thêm phần tử vào mảng
        2. CẦN GÌ TA: cái mảng chứ gì boa, phần từ cần thêm móa
        3. LÀM NÀO TA: bắc nồi nước cho sôi ở 90độ xong xong đem gói mì bỏ vào, lấy búa đập cái thung máy tính nhỏ ra cho chung vào mì để ăn KAKA!!!
    
  • Tới đây giờ tạo mảng kiểu gì trời đất ơi,

    1. Ấy đìu à đề kêu tạo mảng gồm các số nguyên(KIỂU DỮ LIỆU = "học sinh" hay "số"). NGON, dễ ợt mảng chứa các số. đặt tên "int arrayInt = {0}" cho dễ nhớ kaka.
    
    2. Ý tý quên mảng có phần tử nào chưa (GIÁ TRỊ KHỞI TẠO), thôi cho mọe 2 phần tử trước đi. Ủa lấy đâu ra 2 cái phần tử? gán bừa vào
    
  • mọe nhiều thứ quá đê (THÔI VIẾT RA GIẤY CHỨ NHỚ HÔNG nổi huhu, chưa quen bố cứ ghi từng gạch đầu dòng tý sắp xếp ý sau vậy).

    3. Mém chít còn "số lượng phần tử" của mảng nữa, tạo cái biến nguyên tên " elements = 2" thì tý nữa tăng lên thì cộng thêm thui haha, Ấy không được phải viết hàm riêng thêm riêng mà, mà nhớ đâu đó thằng Tèo bảo phải sài con trỏ gì đó mới thêm được. Vậy sài con trỏ sao ta?
    
    4. Thôi bắc nốt thêm nồi mì nữa ăn cho ấm đã, đập thêm cái màn hình với bàn phím vào cho bổ. HiHi.
    
  • À THÌ RA LÀ KHÔNG CẦN NHỚ HẾT TỚI ĐÂU NÓ TỰ LÒI TỚI ĐÓ THÔI, mà muốn nhớ cả đám này thì ghi vào giấy thôi, quá dễ dàng KAKA.

    5. Giờ lại lòi cái thằng hàm, ờ thì tao ăn no rùi mà chưa tới món chính sợ mèo gì. Hàm thì cần chức năng của ló là mô nứa là biết ngay cái kiểu trả về chi rứa. Hàm thêm hả, vậy thì cho mày kiểu trả về là có thêm được không đi. Kiểu "int" được thì trả về 1, còn không thì 0. Tên thì cho đại là "addOneElement"
    
  • Tèn ten tới món mì trộn con chuột, à nhầm con trỏ. Món chính là đây chứ đâu haha. Uầy dăm ba cái lày triển luôn, tham số của hàm là gì ta? Đối số là cải chi mà làm ta ăn hoài không ngấm?

    6. Hàm cần truyền vào cái mảng mới tạo ở trên với cái số lượng phần tử phải hông toa? Chắc zậy rùi, ghi sao nhể hông lẽ ghi "int addOneElement(int arrayInt, int elements)". NEXT NEXT mấy cái trong ngoặc này là THAM SỐ đây mà
    
    7. Vậy lúc gọi hàm nhét nhét gì vào ta ơi, À há nhét cài mảng với cái số phần từ vào chó nó. Uầy vậy là lúc gọi hàm này ở đâu đó là phải truyền 2 ĐỐI SỐ cho nó đây mà. Ở đâu đó "addOneElement(tenmang, sophantu)";
    
  • Có gì sai sai, Theo tâm sinh lý thuyết ->cái mảng muốn tăng lên -> cần cho phép cái hàm tăng 1 đơn vị “số lượng phần tử” của cái mảng arrayInt. Cần miếng mì trộn chuột máy tính (CON TRỎ CHĂNG).

     8. Vậy theo tâm sinh sản thuyết thì con trỏ dùng để lưu trữ địa chỉ, Úi sời vậy thì ở chỗ nào có đối số thì Bố phang cái "addOneElement(&tenmang, &sophantu)" vào. (DẤU & ĐỂ LẤY ĐỊA CHỈ)
    
     9. Còn chỗ nào cái tham  chiếu thì ta phang cái "int addOneElement(int arrayInt[], int *elements)" vào. (DẤU * ĐỂ CHO MÀY LÀ CON CHỈ TRỎ VÀO ĐỊA CHỈ)
    
     10. TOANG đổi nghề, vẫn còn 1 cái chi rứa sai mô, MẢNG CŨNG GIỐNG CON TRỎ, thôi dẹp dẹp tự hiểu lun đi. dễ mà.
    

XONG đã luyện xong 10 chương cửu âm chân lý. Cảm thấy cuộc sống CÀNG bế tắc THÊM.

Next Chapter: LOADING… tới sáng mai

  • Trả về của hàm RETURN 1 or 0
  • Cách kiểm tra IF ELSE trong hàm
  • Ý nghĩa tách biệt duy nhất
  • Cách sắp xếp các ý tưởng trong LÃO
  • Có phí thời gian khi viết cả đám trên hay không thay vì vậy Code cho rùi.
  • Thiếu xót là chuyện của TRÁI ĐẤT LỊCH SỬ. chốt (chắc chắn có BUG trong cái đám rừng trên). :disappointed_relieved: :disappointed_relieved:
4 Likes

Không biết bây giờ bạn còn cần giúp không nhỉ?

Bài của bạn có khá nhiều lỗi:

  • Thứ nhất nếu đã là C thì viết đúng chuẩn kiểu C đi bạn à.
  • Phần con trỏ khá là hack não, nên bạn bị lẫn lộn cũng phải.

Mình sẽ post lại bài bạn đã được sửa bạn hãy đọc cho kỹ và nếu ko hiểu tại sao mình sửa như vậy thì hãy hỏi. ( Mình sửa theo hướng viết của bạn, ko có nghĩa nó là tốt)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool CheckArray(int *arr,int index){
    fflush(stdin);
    char temp;
    printf("\ntest0 \n");
    if( scanf("%d%c",&(arr)[index], &temp)  == 2){
		if(temp == '\n')
			return true;
	}
	return false;
}

void addValue(int **arr , int *size){
	fflush(stdin);
	(*size)++;
	(*arr) = (int*)realloc(*arr, (*size) * sizeof(int));
	printf("Input number to array:");
	while( !CheckArray(*arr, *size-1 ) ){
		printf("Invaild a value: ");
	};
	//scanf("%d",arr+(size-1));
	printf("Number of array: %d\n",(*arr)[*size-1]);
}

bool CheckMenu (int *number , int min , int max  ) {
fflush(stdin);
char temp;
printf("Input menu:\n");
if( scanf("%d%c", number, &temp)  == 2)
	{
		if((temp == '\n') && ((*number >= min) && (*number <= max)))
			return true;
	}
	return false;
}
void menu(int **arr, int *size){
	int number ;
	while(true){
	if(number == 6 ) break ;
	printf("------MENU----\n");
	printf("1. Add a value\n");
	printf("2. Search a value\n");
	printf("3. Print out array \n");
	printf("4. Print out values in range inputted min and max values, inclusively\n");
	printf("5. Sort the array in ascending order\n");
	printf("0. Exit\n\n");
	while(!CheckMenu( &number, 1,6 ) ){
		printf("Wrong! Try again\n");
	}
	switch (number)
   {
      case 1:	addValue(arr,size) ;      	  break;

   }
}
}
int main(){
	int  size = 1;
	int *arr;
	arr = (int *)malloc(size* sizeof(int));
	menu(&arr,&size);
	free(arr);
	return 0 ;
}
2 Likes

nhưng mà đoạn printf của em bị lỗ invalid types ‘int[int]’ for array subscript và không biêt lý do rõ ràng như nào

Mảng 1 chiều thì có 1 sao thôi :slight_smile: Dù là hàm cấp phát người ta vẫn return chứ ko để hai sao (hay d+1 sao). Nên sửa lại chỗ này đầu tiên.

3 Likes

Hình như các cmt không được đọc thì phải.

  • Mảng 1 chiều thì dùng con trỏ cấp 1 int *p thôi. Cứ dùng con trỏ cấp 2 (mình gọi tắt : p2p) làm gì. P2p chỉ dùng trong lúc bất đắc dĩ hoặc mảng 2 chiều chứ mới học như mình với bạn dùng p2p làm gì cho thêm rối. :slight_smile:

Mình nghĩ bạn nên đổi tag sang C++ cho đúng với code vì :

  • C không có thư viện cstdlib :slight_smile: . Trong C là stdlib.h.
  • Kiểu tham chiếu int &n là của C++ :slight_smile: chứ không phải của C :slight_smile: . C muốn truyền vui lòng sử dụng pointer :slight_smile: .

Mình nghĩ là bạn đang sử dụng tài liệu Tiếng Việt để học. Mình không có ý chê người Việt chúng ta nhưng khá nhiều tài liệu Tiếng Việt kiểu thập cẩm khi dùng C và C++ lẫn lộn và mình cũng bị dính chưởng rồi :slight_smile: . Mình khuyên bạn nên tìm kiếm một số tài liệu Tiếng Anh để tìm đọc và nghiên cứu vẫn hơn vì như mình thấy có vẻ khả năng Tiếng Anh của bạn khá tốt vì hình như bạn cũng đăng 1 bài bên stackover


Tài liệu thì bạn có thể tham khảo tài liệu trong link này:

Thực chất toàn tài liệu của anh Đạt thôi.
Mình cũng có học theo 2 tài liệu Tiếng Anh này:

  • MAL - 645 Quyển này nhẹ và cũng khá dễ dàng cho người mới bắt đầu.
  • Deitel Quyển này khá dày nhưng mình thấy khá chi tiết (my opinion)
3 Likes

em đừng nhớ gì hãy quên đi , đây đống hỗn độn em đừng đọc sẽ tốt , anh viết xong chả hiểu mấy

môn mình học C nhưng phần mềm trên trường thì nó tạo ra C/C++ thôi nên thư viện lẫn lộn , còn giáo trình mình học tiếng anh có mỗi sách mính không mượn nên hơi toang

ý bạn là dòng của bạn hay của tui bị lỗi cơ.
Như cách bạn khác đã nói, ko việc gì phải dùng 2-d cả, nếu bạn muốn cấp phát động, thì hãy viết ra 1 hàm riếng cấp phát ngay từ đầu.

void allocation( int **arr , int size){
(*arr) = (int*)malloc( (*arr) * sizeof(int)); 
}
  • Sau sau bước này khi truyền mảng arr đi bạn chỉ cần truyền như 1 mảng bình thường
    menu( arr, &size);void menu( int arr[], int *size )
  • Để mình giải thích, ban đầu bạn chỉ mới tạo con trỏ arr cho nên để truyền qua hàm khác bạn cần tạo con trỏ của nó thành ra pointer to pointer. Sau khi cấp phát động xong, nó đã là 1 mảng thực sự.
  • Xin lỗi đã trả lời chậm, mình quên mất bài viết này.
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?