给茄子疏叶的作用是啥?正确的疏叶方法是怎样的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给茄子疏叶的作用是啥?正确的疏叶方法是怎样的?相关的知识,希望对你有一定的参考价值。

过度摘叶,特别是去除植物中上部完全发育的叶后,植物光合叶面积减少,光合效率下降,叶制营养物质减少,果实膨胀速度慢,容易出现畸形果。同时,水果长期暴露在直射光线下,容易导致果皮发黄,影响果实的商品性。叶子稀疏的时候和部分侧枝一起变小,只有股价地长了部分叶子,叶子制作的营养主要供应股价地的生长,容易生长,茎变弱。与此同时,由于叶子制造的营养物质不足,植物的下部分支得不到足够的营养,侧面的结果能力下降,畸形果增加,产量和质量都下降。

因此,在长枝成就期,叶很少的情况下,打枝必须适量,不能过度摘叶。成熟树叶时,对朱家志的叶子,在底部果实下面留下1-2片叶子,其余下部桨叶都很小,不能去除植物中上部完全发育的叶子。对于已经结出果实的侧枝,只需在果实上留下两片叶子来摘心即可。把茄子果实去掉后,要把摘下来的茄子果实下部的老叶子去掉,这种茄子果实上部的叶子都要保存下来。在罕见的叶子后,这时要保证植物生长的枝叶和下部至少有两个功能叶能够制造营养。随着茄子果实的逐渐采集,逐渐使下部叶变小。因为只有保存树枝和下部的功能叶,叶子制作的营养才能满足根的生长需要和植物本身生殖生长和营养生长的需要。

如果植物长得太旺,叶面积太大,叶子重叠很多,可以选择性地从植物内部去除看不见光的叶子,不减少叶子产生的营养成分,反而减少叶子的营养消耗,使植物长得结实,取得良好的效果。对侧枝的叶子,摘或少摘比较合适。因为这些叶子对田间通风的影响很小,不会引起共鸣。同时,这些叶子还负责制造营养供应的根生长,因此尽可能不要疏忽。这里介绍了原菜准确地去除叶子的方法。如果原菜的侧枝太长,超过10厘米时,可以留下2~3片叶子摘心。但是植物长得太好,叶子太多,多余的叶子就会白白消耗营养。因此,正确的叶子掉落很重要。

不要强行捏,最好用剪刀剪叶柄,减少伤口,不要拉树枝。为了保护树枝,打叶子时不要从叶柄的基础上去除叶子,要留下约1厘米长的叶柄来保护树枝。另外,叶子要在晴朗温暖的日子上午温度高的时候进行,使剩下的叶柄上的伤口早点愈合,防止病菌感染。要收集脱下来的桨叶和兵叶,带到田外堆积或掩埋。摘叶子通常坐在门边,从下往上摘,摘叶子要依次进行,不要一次打太多,把植物的下部做成几乎轻的茎。股价指数结果之前,一般不要摘叶子。下叶叶具有制造营养供应根生长的重要作用,因此,如果下叶虫卵多或叶黄化,最好及时清除。

参考技术A 让阳光更好的照在茄子的其他叶子上,留一些空间可以吹一些风进来,让它快速的成长。选择一些病变的,颜色不新鲜的,看起来不健康的叶子,把他们去除,适当的选择,这样可以造成好的效果。 参考技术B 可以帮助茄子增加产量,可以根据这个茄子的长相以及叶片的大小,还有天气气候的情况来判断疏叶。 参考技术C 疏叶是怕茄子在生长的过程中与根茎打结。方法是将长势不好的叶子全部拔下,这样就不会影响茄子的生长。 参考技术D 作用就是让叶片长得更加绿油油一些,这样开花就会更大,结出的果子也更大,正确的方法是有把多余的叶片拨开,多余的叶片就剪掉。

分配数据以传递给 FFI 调用的正确方法是啥?

【中文标题】分配数据以传递给 FFI 调用的正确方法是啥?【英文标题】:What is the right way to allocate data to pass to an FFI call?分配数据以传递给 FFI 调用的正确方法是什么? 【发布时间】:2017-01-25 19:49:33 【问题描述】:

在discussing/learning about the correct way to call a FFI of the Windows-API from Rust 之后,我玩得更远了,想再次检查一下我的理解。

我有一个被调用两次的 Windows API。在第一次调用中,它返回实际输出参数所需的缓冲区大小。然后,使用足够大小的缓冲区再次调用它。我目前正在使用 Vec 作为此缓冲区的数据类型(参见下面的示例)。

代码有效,但我想知道这是否是正确的方法,或者使用alloc::heap::allocate 之类的函数直接保留一些内存然后使用transmute 将结果从FFI 回来了。同样,我的代码有效,但我试图在幕后看一点。

extern crate advapi32;
extern crate winapi;
extern crate widestring;
use widestring::WideCString;
use std::io::Error as IOError;
use winapi::winnt;

fn main() 
    let mut lp_buffer: Vec<winnt::WCHAR> = Vec::new();
    let mut pcb_buffer: winapi::DWORD = 0;

    let rtrn_bool = unsafe 
        advapi32::GetUserNameW(lp_buffer.as_mut_ptr(),
                               &mut pcb_buffer )
    ;

    if rtrn_bool == 0 

        match IOError::last_os_error().raw_os_error() 
            Some(122) => 
                // Resizing the buffers sizes so that the data fits in after 2nd 
                lp_buffer.resize(pcb_buffer as usize, 0 as winnt::WCHAR);
             // This error is to be expected
            Some(e) => panic!("Unknown OS error ", e),
            None => panic!("That should not happen"),
        
    


    let rtrn_bool2 = unsafe 
        advapi32::GetUserNameW(lp_buffer.as_mut_ptr(), 
                               &mut pcb_buffer )
    ;

    if rtrn_bool2 == 0 
        match IOError::last_os_error().raw_os_error() 
            Some(e) => panic!("Unknown OS error ", e),
            None => panic!("That should not happen"),
        
    

    let widestr: WideCString = unsafe  WideCString::from_ptr_str(lp_buffer.as_ptr()) ;

    println!("The owner of the file is :?", widestr.to_string_lossy());

依赖关系:

[dependencies]
advapi32-sys = "0.2"
winapi = "0.2"
widestring = "*"

【问题讨论】:

切线相关:Allocating an object for C / FFI library calls. 【参考方案1】:

理想情况下,您应该使用std::alloc::alloc,因为您可以在布局中指定所需的对齐方式:

pub unsafe fn alloc(layout: Layout) -> *mut u8

主要的缺点是您需要知道对齐方式,即使您释放了分配。

使用Vec 作为一种简单的分配机制是一种常见的做法,但在使用它时需要小心。

    确保您的单位正确 - “长度”参数是 items 的数量还是 bytes 的数量? 如果将Vec 分解为组件,则需要
      跟踪长度容量。有些人使用shrink_to_fit 来确保这两个值相同。 避免跨流 - 内存是由 Rust 分配的,必须由 Rust 释放。将其转换回 Vec 以被删除。

    注意空的Vec 确实有一个 NULL 指针!:

    fn main() 
        let v: Vec<u8> = Vec::new();
        println!(":p", v.as_ptr());
        // => 0x1
    
    

对于您的具体情况,我可能建议使用Veccapacity 而不是自己跟踪第二个变量。您会注意到在第一次调用后您忘记更新pcb_buffer,所以我很确定代码总是会失败。这很烦人,因为它需要是一个可变引用,因此您无法完全摆脱它。

此外,您可以只使用reserve 空格,而不是extendVec

也不能保证第一次调用所需的尺寸与第二次调用所需的尺寸相同。你可以做一些循环,但是你不得不担心会发生无限循环。

【讨论】:

感谢您的回答。所以,我想我最好坚持使用 Vec 的稳定解决方案。我将 Vec 的内容更改为 winnt::CHAR 以便项目数和长度之间没有差异。我想这会让事情变得更容易。 我对你的回答有两个问题: - 你说我必须将内存转换回 Vec 以被删除是什么意思。 - 我不确定我可以使用容量而不是我的第二个变量,因为这个变量也作为输出参数传递给 FFI。 Windows API 将覆盖这个变量的内容,我想用我的 Vec 的容量来做这件事不是一个好主意。还是我在这方面误会了你? @Norbert 我澄清了一点。转换回 Vec 仅在您已分解 Vec 开始时;你的情况似乎没有。对于后者,我的意思是使用 capacity 的值而不是 0,但您必须有另一个变量作为参考传递。【参考方案2】:

这是我想出来的。

pub struct FfiObject 
    pub ptr: *mut u8,
    pub size: usize,

impl FfiObject 
    // allocate and zero memory
    pub fn new(size: usize) -> FfiObject 
        FfiObject::_from_vec(vec![0u8; size], size)
    
    // allocate memory without zeroing
    pub fn new_uninitialized(size: usize) -> FfiObject 
        FfiObject::_from_vec(Vec::with_capacity(size), size)
    
    fn _from_vec(mut v: Vec<u8>, size: usize) -> FfiObject 
        assert!(size > 0);
        let ptr = v.as_mut_ptr();
        std::mem::forget(v);
        FfiObject  ptr, size 
    

impl Drop for FfiObject 
    fn drop(&mut self) 
        unsafe  std::mem::drop(Vec::from_raw_parts(self.ptr, 0, self.size)) ;
    

FFI 对象是使用u8 向量创建的,因此大小以字节为单位。这可以概括为使用任意类型而不是 u8,但请记住 Shepmaster 关于字节数和项目数之间区别的警告。

这是一个使用FfiObject的例子:

// Ask the library for the size.
let mut size: usize = 0;
let mut success = GetObjectSize(&mut size);
if success && size > 0 
    // allocate and zero memory for the object
    let ffi_obj = FfiObject::new(size);
    // Pass the memory to a foreign function
    success = DoSomethingWithObject(ffi_obj.ptr, &ffi_obj.size);

【讨论】:

以上是关于给茄子疏叶的作用是啥?正确的疏叶方法是怎样的?的主要内容,如果未能解决你的问题,请参考以下文章

分配数据以传递给 FFI 调用的正确方法是啥?

将取消令牌传递给异步流的正确方法是啥?

从另一个视图重新绑定剑道网格到以前的搜索条件的正确方法是啥(后退按钮不起作用)

将表单元素状态传递给兄弟/父元素的正确方法是啥?

将“this”传递给新对象的内联重写方法的正确方法是啥? [复制]

Swift:拆分 [String] 得到具有给定子数组大小的 [[String]] 的正确方法是啥?