2013-07-27 24 views
16

Tôi gặp phải hành vi kỳ lạ nhất trong VS 2012 (tôi đang viết bằng cpp).thêm chương trình xem định danh không xác định visual studio 2012, cpp

Tôi nhấp vào "thêm đồng hồ" trên một biến và thông báo "số nhận dạng không xác định".

Dưới đây là một ví dụ về mã:

for (int j=0;j<32;j++) 
     { 
      unsigned char curValue=desc1.at<unsigned char>(0,j); 
      printf("%s\n",curValue);  
     } 

tôi đã phải sử dụng printf để hiển thị giá trị của curValue. lol.

Có ai đã gặp phải hành vi như vậy không?

Chỉnh sửa: điều lạ lùng hơn xảy ra. Khi gỡ lỗi mã sau:

int b1[8]; 

    for (int k=0;k<7;k++) 
     b1[k]=0; 

    char q=curValue; 
    int t=0; 
    while (q!=0){ 
     b1[t++]=q%2; 
     q=q/2; 
    } 

Trình gỡ lỗi chỉ bỏ qua vòng lặp với b1 [k] = 0;

Xin lưu ý rằng curValue không được xác định ngay cả trong vòng lặp.

Cảm ơn!

+0

Một giải pháp cho vấn đề là để lại tối ưu hóa của trình biên dịch được kích hoạt, nhưng cho phép/Zo (Nâng cao Debugging Tối ưu hóa) nói với trình biên dịch để tạo ra thông tin gỡ lỗi bổ sung mà làm việc với mã được tối ưu hóa. Điều này chỉ có sẵn cho Visual Studio 2013 cập nhật 3 hoặc mới hơn. xem https://msdn.microsoft.com/en-us/library/dn785163.aspx –

Trả lời

22

Như Joachim đã nói: curValue được xác định bên trong vòng lặp. Nếu cửa sổ xem trong studio trực quan nhìn thấy nó như là giá trị không xác định thì bạn nên tắt tối ưu hóa Compiler.

Mặc định tối ưu hóa trình biên dịch là/tối ưu hóa O2 cho tốc độ. Để tắt nó đi:

  • Tới dự án, nhấp chuột phải và chọn thuộc tính
  • Cấu hình Properties-> C/C++ -> Tối ưu hóa
  • chọn tối ưu hóa và thay đổi nó từ Tối đa hóa tốc độ (/ O2) để khuyết tật (/ Od) enter image description here
+2

Cũng lưu ý rằng điều này chủ yếu được sử dụng cho chế độ cấu hình gỡ lỗi, không phù hợp với các bản phát hành cần có cả lỗi và không bị lỗi. Cảm ơn bạn. –

1

Hãy nhớ rằng biến số curValue chỉ hợp lệ bên trong vòng lặp, nếu bạn cố thêm nó vào đồng hồ khi bạn không ở trong vòng lặp thì biến không được xác định.

+0

Cảm ơn câu trả lời, nhưng nó không được xác định ngay cả bên trong vòng lặp. – GilLevi

+3

@ user2215359 Bạn đã bật tối ưu hóa chưa? Họ có thể làm rối tung mọi thứ khi gỡ lỗi. Và trong trường hợp này, nếu vòng lặp không chứa nhiều hơn gán cho 'curValue' nhiều khả năng * sẽ * được tối ưu hóa. –

+1

Cảm ơn câu trả lời. Làm cách nào để kiểm tra xem tôi đã bật tối ưu hóa chưa? – GilLevi

1

curValue vượt quá phạm vi bên ngoài vòng lặp for.

Cũng lưu ý rằng bạn nên sử dụng %c trong printf để in char. %s được sử dụng cho các chuỗi kiểu C.

printf("%c\n",curValue); 
1

Biến số curValue chỉ hợp lệ trong vòng lặp. Nếu bạn sẽ cố gắng thêm nó vào "đồng hồ" khi bạn không ở trong vòng lặp, thì biến của bạn sẽ không được xác định.

Lưu ý: Tốt hơn bạn nên in này:

printf("%c\n",curValue); 

Thay vì điều này:

printf("%s\n",curValue) 
4

tôi đã tối ưu hóa bật. Điều đó làm rối tung sự cố của tôi.

2

Nếu không có printf, vòng lặp đầu tiên không có tác dụng phụ và do đó có thể được tối ưu hóa trong một bản dựng được tối ưu hóa. Trong ví dụ thứ hai, vòng lặp khởi tạo mảng nhỏ thành 0 có thể được thay thế bằng phần dữ liệu được khởi tạo.

Bạn có thể cố gắng gỡ lỗi bằng một bản dựng chưa được tối ưu hóa.

Cũng lưu ý rằng trình gỡ lỗi Visual Studio có trình hiển thị khá tốt cho các vùng chứa tiêu chuẩn. Vì vậy, nếu toàn bộ điểm của vòng lặp đầu tiên chỉ để nhìn vào nội dung của desc1, bạn có thể chỉ cần kiểm tra trực tiếp trong trình gỡ lỗi.

+0

Cảm ơn tất cả những ai đã trả lời. – GilLevi

Các vấn đề liên quan