2016-03-21 23 views
1

Bir menü katmanında haber içeriğini görüntüleyen orijinal çakıl için kişisel bir haber kaynağı uygulaması tasarlıyorum. Bir yükleme görüntüsü görüntüleyen ve telefondaki js ile saatim uygulaması arasındaki veri aktarımını işleyen bir pencere içeren iki C dosyası var. Veriler, dosyalar arasında paylaşılan, ancak aşağıda gösterdiğim örnekte alakasız olan bazı extern değişkenlerine kaydedilir (tüm bunların iyi çalıştığına inanıyorum). Belirli koşullar karşılandığındaÇakıl Menüsü Katman Kazası

Ben bir işlev içinde benim ana .c dosyasında news_list_window_init() arıyorum. Şu anda sadece menümüzün kabul edilebilir olduğunu test etmek için kaydırılabilir bir menü içeren bir pencere görüntülemeye çalışıyorum. Kullanmakta olduğum sorun, kaydırmaya çalıştığımda uygulamamın çökmesidir. Ben sadece bu kod ile yeni bir proje oluşturun nerede, aşağıda bağımsız benim .c dosyasını test ettik

ault_handling.c:78> App fault! {f5ec8c0d-9f21-471a-9a5c-c83320f7477d} PC: 0x800fd5b LR: ??? 
Program Counter (PC) : 0x800fd5b ??? 
Link Register (LR)  : ???  ??? 

, açıklama: pencere tüm menü öğeleri var ama ben kaydırırken uygulaması ile mevcut görünür ilgili olmayan news_list.h ve externs.h başlık dosyaları ve dosyanın altındaki ana işlevde yorum yapın. Bu iyi çalışıyor, menü kaydırıyor ve çökme yok ve her şey iyi görünüyor.

Sorunun ana dosyamda nasıl göründüğünü göremiyorum, çünkü bu dosyada yer alan tek işlev news_list_window_init() olduğundan, menü gerçekten doğru şekilde görüntüleniyor. Uygulamayı geri düğmesiyle bile düzgün bir şekilde kapatabilirim. Ancak kaydırmaya çalışmak, uygulamayı kilitler. Bu hatayı neden olabileceğine dair bir kayıp yaşıyorum. Herhangi bir öneri var mı? Teşekkürler!

Bu, ilgili .c dosyasıdır:

// news_list.c 
#include "pebble.h" 
#include "news_list.h" 
#include "externs.h" 

#define NUM_MENU_SECTIONS 1 

static Window *news_list_window; 
static MenuLayer *menu_layer; 

static uint16_t menu_get_num_sections_callback(MenuLayer *menu_layer, void *data) { 
    return NUM_MENU_SECTIONS; 
} 

static uint16_t menu_get_num_rows_callback(MenuLayer *menu_layer, uint16_t section_index, void *data) { 
    return str_count; // Variable story count 
} 

static int16_t menu_get_header_height_callback(MenuLayer *menu_layer, uint16_t section_index, void *data) { 
    return MENU_CELL_BASIC_HEADER_HEIGHT; 
} 

static void menu_draw_header_callback(GContext* ctx, const Layer *cell_layer, uint16_t section_index, void *data) { 
    menu_cell_basic_header_draw(ctx, cell_layer, "Header"); 
} 

static void menu_draw_row_callback(GContext* ctx, const Layer *cell_layer, MenuIndex *cell_index, void *data) { 
    menu_cell_basic_draw(ctx, cell_layer, "Menu Item", NULL, NULL); 
} 

static void menu_select_callback(MenuLayer *menu_layer, MenuIndex *cell_index, void *data) { 
    // Currently Empty 
} 

int16_t menu_get_cell_height_callback(struct MenuLayer *menu_layer, MenuIndex *cell_index, void *callback_context) 
{ 
    return 40; 
} 

static void news_list_window_load(Window *window) { 
    // Now we prepare to initialize the menu layer 
    Layer *window_layer = window_get_root_layer(window); 
    GRect bounds = layer_get_frame(window_layer); 

    // Create the menu layer 
    menu_layer = menu_layer_create(bounds); 
    menu_layer_set_callbacks(menu_layer, NULL, (MenuLayerCallbacks){ 
    .get_num_sections = menu_get_num_sections_callback, 
    .get_num_rows = menu_get_num_rows_callback, 
    .get_header_height = menu_get_header_height_callback, 
    .draw_header = menu_draw_header_callback, 
    .draw_row = menu_draw_row_callback, 
    .select_click = menu_select_callback, 
    .get_cell_height = menu_get_cell_height_callback, 
    }); 

    // Bind the menu layer's click config provider to the window for interactivity 
    menu_layer_set_click_config_onto_window(menu_layer, window); 

    layer_add_child(window_layer, menu_layer_get_layer(menu_layer)); 
} 

static void news_list_window_unload(Window *window) { 
    // Destroy the menu layer 
    menu_layer_destroy(menu_layer); 
} 

void news_list_window_init() { 
    news_list_window = window_create(); 
    window_set_window_handlers(news_list_window, (WindowHandlers) { 
    .load = news_list_window_load, 
    .unload = news_list_window_unload, 
    }); 
    window_stack_push(news_list_window, true); 
} 

void news_list_window_deinit() { 
    window_destroy(news_list_window); 
} 

// int main(void) { 
// news_list_window_init(); 
// app_event_loop(); 
// news_list_window_deinit(); 
// } 

Bu alakalı .h dosyasıdır: Ben bellek gerçekten çok düşük çalıştırıyorum bu ne zaman yaşadım

// news_list.h 
#ifndef NEWS_LIST_H 
#define NEWS_LIST_H 

// Public Function list 
void news_list_window_init(void); 
void news_list_window_deinit(void); 

#endif 

cevap

2

, ya da bir şekilde hafıza bozuyorsam.

Onlar (menu_layer_create, Malloc vs.) ise NULL ve kaydeden tüm dönüş değerleri kontrol ve balyalama öneririm. Orijinal bir çakıl taşı üzerinde çalışıyoruz ve communication için büyük bellek tamponları tahsis eğer, çok hızlı bir şekilde bellek yetersiz çalıştırabilirsiniz -

Ayrıca, ne kadar free memorylogging deneyin. Son olarak, bir dizinin sonunu yanlışlıkla yazmadığınızdan veya yığında bir değere çakılan bir değeri bir çakıl çağrısına geçirdiğinizden emin olmak için bellek ayırıp kullanan tüm kodları gözden geçirin. Yapmadığım zaman kötü bir yapıda bir değere sahip olduğumu düşünmemek için malloc yerine calloc kullanmayı seviyorum.

Daha önce burada oldum - bu UI kod kolay, ancak büyük olasılıkla tamamen ilgisiz değil - çarpışma sadece bir belirtisidir. Biz ... tam app

Damian

+1

bir göz atın böylece şeyin belki github tam kod sonrası başarısız olursa Kesinlikle bellek konu oldu. Benim javascript uygulamasından büyük bir veri dizisini saatim uygulamasına göndermeye çalışıyordum, bu yüzden tüm belleğimi yediğim çok büyük bir arabelleğe 'app_message_open' adını verdim. Yardımın için teşekkürler. –